自定義EditText輸入四位一個空格的銀行賬號形式

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;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章