public class AccountEditText extends AppCompatEditText {
private static final char KEY = ' '; public AccountEditText(Context context) { super(context); init(); } public AccountEditText(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init(){ //添加過濾器 setFilters(new InputFilter[]{new InputFilter() { @Override public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) { //刪除字符 if (i2!=i3){ return null; } //在edittext的文本後面繼續輸入 if (i2>=spanned.toString().length()){ if (isKeyPosition(i2)){ return " "+charSequence; } //在文本之間輸入 }else { //重新設置格式 StringBuffer buffer=new StringBuffer(spanned); buffer.insert(i2,charSequence); checkPattern(buffer); return null; } return null; } }}); } /** * 刪除事件處理 * 有些鍵盤監聽不到此事件 * @param keyCode * @param event * @return */ @Override public boolean onKeyUp(int keyCode, KeyEvent event) { checkPattern(); return super.onKeyUp(keyCode, event); } @Override public void setText(CharSequence text, BufferType type) { super.setText(text, type); } /** * 解決複製黏貼無法轉換輸入格式的問題 * @param id * @return */ @Override public boolean onTextContextMenuItem(int id) { switch (id){ //黏貼 只處理黏貼事件 case android.R.id.paste: super.onTextContextMenuItem(id); checkPattern(); return true; default: return super.onTextContextMenuItem(id); } } /** * 刪除多餘的空格,在指定的位置輸入空格 */ private void checkPattern() { StringBuffer text=new StringBuffer(getText()); //獲取當前光標的位置 int selectionStart = getSelectionStart(); for (int i = 0; i < text.length(); i++) { char charAt = text.charAt(i); if (isKeyPosition(i)) { if (charAt != KEY) { text.insert(i, KEY); if (i<selectionStart){ selectionStart++; } } }else{ if (charAt==KEY){ text.delete(i,i+1); //移動光標 if (i<selectionStart){ selectionStart--; } } } } setText(text); setSelection(Math.min(text.length(), selectionStart)); } /** * 處理中間輸入 */ private void checkPattern(StringBuffer text) { //獲取當前光標的位置 int selectionStart = getSelectionStart(); for (int i = 0; i < text.length(); i++) { char charAt = text.charAt(i); if (isKeyPosition(i)) { if (charAt != KEY) { text.insert(i, KEY); } }else{ if (charAt==KEY){ text.delete(i,i+1); } } } setText(text); if (text.charAt(selectionStart)==KEY){ selectionStart+=2; }else { selectionStart++; } setSelection(Math.min(text.length(), selectionStart)); } /** * edittext 銀行卡輸入每四個一個空格 * 計算規則 * * @param position * @return */ private boolean isKeyPosition(int position) { return (position+1)%5 == 0; }
}