Android 编辑文本输入过滤器

Android EditText InputFilter

如何使用过滤器一次删除两个字符?

我正在尝试对 EditText 应用一个简单的过滤器。
它必须按如下方式工作:
(要接收格式:1234 5678....)

===> 已编辑:第一部分效果很好。

1) 当 EditText 中有 4 位数字时,我正在输入第 5 位数字 -
首先必须出现一个space,然后是这个数字。
2)我需要一个相反的(在字符删除期间)-
space 必须删除第 5 个数字。

我的代码有什么问题?

editText.setFilters(new InputFilter[]{new DigitsKeyListener(Boolean.FALSE, Boolean.TRUE) {

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

        //  any chars except backspace
        if (!source.equals("")) {
            if (dest.length() == 4) {
                // here I must add a space and then the source
                // ===> EDITED:
                return " " + source;
                // return super.filter(" " + source, start, end + 1, dest, dstart, dend + 1);
            } // backspace entered
        } else {
            if (dest.length() == 6) {
                // here I must delete the 6-th character 
                // and the space before
                return super.filter(source, 0, 0, dest, 5, 6);
            }
        }

        return null;
    }
}});

我建议你使用TextWatcher来格式化你的EditText输入,因为InputFilter一般用于输入限制,决定什么可以输入而不是格式化文本。

您将使用此代码获得所需的输出:

String mTextValue;
Character mLastChar = '[=10=]'; // init with empty character
int mKeyDel;

myEditText.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

           String eachBlock[] = myEditText.getText().toString().split(" ");

           myEditText.setOnKeyListener(new View.OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                   if (keyCode == KeyEvent.KEYCODE_DEL)
                         mKeyDel = 1;
                         return false;
                   }
             });

            if (mKeyDel == 0) {

               if (((myEditText.getText().length() + 1) % 5) == 0) {
                   myEditText.setText(myEditText.getText() + " ");
                   myEditText.setSelection(myEditText.getText().length());
               }

               mTextValue = myEditText.getText().toString();

            } else {

               mTextValue = myEditText.getText().toString();

               if (mLastChar.equals(' ')) {
                    mTextValue = mTextValue.substring(0, mTextValue.length() - 1);
                    myEditText.setText(mTextValue);
                    myEditText.setSelection(mTextValue.length());
                }

               mKeyDel = 0;

            }

       }

       @Override
       public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if (s.length()>0) {// save the last char value
                mLastChar = s.charAt(s.length() - 1);
            } else {
                mLastChar = '[=10=]';
            }
       }

       @Override
       public void afterTextChanged(Editable s) {}

 });

请使用这个

public class CustomFormatWatcher implements TextWatcher {

    private int size;

    public CustomFormatWatcher(int size) {
        this.size = size;
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        char hyphen = ' ';
        char c = 0;
        if (editable.length() > 0) {
            c = editable.charAt(editable.length() - 1);
            if (c == hyphen) {
                editable.delete(editable.length() - 1, editable.length());
            }
        }
        if (editable.length() > 0 && (editable.length() % size) == 0) {
            c = editable.charAt(editable.length() - 1);
            if (hyphen == c) {
                editable.delete(editable.length() - 1, editable.length());
            }
        }
        if (editable.length() > 0 && (editable.length() % size) == 0) {
            c = editable.charAt(editable.length() - 1);
            // Only if its a digit where there should be a space we insert a hyphen
            if (Character.isDigit(c) && TextUtils.split(editable.toString(), String.valueOf(hyphen)).length <= 3) {
                editable.insert(editable.length() - 1, String.valueOf(hyphen));
            }
        }
    }
}

然后使用

myEditText.addTextChangedListener(new CustomFormatWatcher());