Android實現銀行卡、手機號帶空格格式
阿新 • • 發佈:2020-12-17
本文例項為大家分享了Android實現銀行卡、手機號帶空格格式的具體程式碼,供大家參考,具體內容如下
工具類:
package com.gongzhibao.gzb.widget; import android.content.Context; import android.content.res.TypedArray; import android.support.v7.widget.AppCompatEditText; import android.text.Editable; import android.text.InputFilter; import android.text.InputType; import android.text.TextUtils; import android.text.TextWatcher; import android.text.method.DigitsKeyListener; import android.util.AttributeSet; import android.widget.Toast; import com.gongzhibao.gzb.R; /** * 銀行卡 手機 身份證輸入框 2018/7/9. */ public class ContentWithSpaceEditText extends AppCompatEditText { public static final int TYPE_PHONE = 0; public static final int TYPE_BANK_CARD = 1; public static final int TYPE_ID_CARD = 2; private int start,count,before; private int contentType; private int maxLength = 50; private String digits; public ContentWithSpaceEditText(Context context) { this(context,null); } public ContentWithSpaceEditText(Context context,AttributeSet attrs) { super(context,attrs); parseAttributeSet(context,attrs); } public ContentWithSpaceEditText(Context context,AttributeSet attrs,int defStyleAttr) { super(context,attrs,defStyleAttr); parseAttributeSet(context,attrs); } private void parseAttributeSet(Context context,AttributeSet attrs) { TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.ContentWithSpaceEditText,0); contentType = ta.getInt(R.styleable.ContentWithSpaceEditText_input_type,0); // 必須呼叫recycle ta.recycle(); initType(); setSingleLine(); addTextChangedListener(watcher); } private void initType(){ if (contentType == TYPE_PHONE) { maxLength = 13; digits = "0123456789 "; setInputType(InputType.TYPE_CLASS_NUMBER); } else if (contentType == TYPE_BANK_CARD) { maxLength = 31; digits = "0123456789 "; setInputType(InputType.TYPE_CLASS_NUMBER); } else if (contentType == TYPE_ID_CARD) { maxLength = 21; digits = null; setInputType(InputType.TYPE_CLASS_TEXT); } setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)}); } @Override public void setInputType(int type) { if (contentType == TYPE_PHONE || contentType == TYPE_BANK_CARD) { type = InputType.TYPE_CLASS_NUMBER; }else if(contentType == TYPE_ID_CARD){ type = InputType.TYPE_CLASS_TEXT; } super.setInputType(type); /* 非常重要:setKeyListener要在setInputType後面呼叫,否則無效。*/ if(!TextUtils.isEmpty(digits)) { setKeyListener(DigitsKeyListener.getInstance(digits)); } } /** * 設定內容的型別 * @param contentType 型別 */ public void setContentType(int contentType) { this.contentType = contentType; initType(); } private TextWatcher watcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s,int start,int count,int after) { } @Override public void onTextChanged(CharSequence s,int before,int count) { ContentWithSpaceEditText.this.start = start; ContentWithSpaceEditText.this.before = before; ContentWithSpaceEditText.this.count = count; } @Override public void afterTextChanged(Editable s) { if (s == null) { return; } //判斷是否是在中間輸入,需要重新計算 boolean isMiddle = (start + count) < (s.length()); //在末尾輸入時,是否需要加入空格 boolean isNeedSpace = false; if (!isMiddle && isSpace(s.length())) { isNeedSpace = true; } if (isMiddle || isNeedSpace || count > 1) { String newStr = s.toString(); newStr = newStr.replace(" ",""); StringBuilder sb = new StringBuilder(); int spaceCount = 0; for (int i = 0; i < newStr.length(); i++) { sb.append(newStr.substring(i,i+1)); //如果當前輸入的字元下一位為空格(i+1+1+spaceCount),因為i是從0開始計算的,所以一開始的時候需要先加1 if(isSpace(i + 2 + spaceCount)){ sb.append(" "); spaceCount += 1; } } removeTextChangedListener(watcher); s.replace(0,s.length(),sb); //如果是在末尾的話,或者加入的字元個數大於零的話(輸入或者貼上) if (!isMiddle || count > 1) { setSelection(s.length() <= maxLength ? s.length() : maxLength); } else { //如果是刪除 if (count == 0) { //如果刪除時,游標停留在空格的前面,游標則要往前移一位 if (isSpace(start - before + 1)) { setSelection((start - before) > 0 ? start - before : 0); } else { setSelection((start - before + 1) > s.length() ? s.length() : (start - before + 1)); } } //如果是增加 else { if (isSpace(start - before + count)) { setSelection((start + count - before + 1) < s.length() ? (start + count - before + 1) : s.length()); } else { setSelection(start + count - before); } } } addTextChangedListener(watcher); } } }; public String getTextWithoutSpace() { return super.getText().toString().replace(" ",""); } public boolean checkTextRight(){ String text = getTextWithoutSpace(); //這裡做個簡單的內容判斷 if (contentType == TYPE_PHONE) { if (TextUtils.isEmpty(text)) { showShort(getContext(),"手機號不能為空,請輸入正確的手機號"); } else if (text.length() < 11) { showShort(getContext(),"手機號不足11位,請輸入正確的手機號"); } else { return true; } } else if (contentType == TYPE_BANK_CARD) { if (TextUtils.isEmpty(text)) { showShort(getContext(),"銀行卡號不能為空,請輸入正確的銀行卡號"); } else if (text.length() < 14) { showShort(getContext(),"銀行卡號位數不正確,請輸入正確的銀行卡號"); } else { return true; } } else if (contentType == TYPE_ID_CARD) { if (TextUtils.isEmpty(text)) { showShort(getContext(),"身份證號不能為空,請輸入正確的身份證號"); } else if (text.length() < 18) { showShort(getContext(),"身份證號不正確,請輸入正確的身份證號"); } else { return true; } } return false; } private void showShort(Context context,String msg){ Toast.makeText(context.getApplicationContext(),msg,Toast.LENGTH_SHORT).show(); } private boolean isSpace(int length) { if (contentType == TYPE_PHONE) { return isSpacePhone(length); } else if (contentType == TYPE_BANK_CARD) { return isSpaceCard(length); } else if (contentType == TYPE_ID_CARD) { return isSpaceIDCard(length); } return false; } private boolean isSpacePhone(int length) { return length >= 4 && (length == 4 || (length + 1) % 5 == 0); } private boolean isSpaceCard(int length) { return length % 5 == 0; } private boolean isSpaceIDCard(int length) { return length > 6 && (length == 7 || (length - 2) % 5 == 0); } }
資原始檔values下建立attrs檔案
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="ContentWithSpaceEditText"> <attr name="input_type" format="enum"> <enum name="phone" value="0"/> <enum name="bank_card_no" value="1"/> <enum name="identify_card_no" value="2"/> </attr> </declare-styleable> </resources>
使用
bank.setContentType(1);//銀行卡號 phone.setContentType(0);//電話號 number.setContentType(2);//身份證號
獲取內容(去掉空格)
phone.getText().toString().replace(" ","");
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。