Android 在用户输入时验证输入

Android validate input while user inputs

我有一个 EditText 用户必须输入一个 phone 数字。 phone 号码的模式是:^5[4][0-9]{10}$ 第一个号码是 5,第二个号码是 4,后跟 10 个数字。

我试过使用以下 InputFilter

            InputFilter filter= new InputFilter() {
                public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                    for (int i = start; i < end; i++) {
                        String checkMe = String.valueOf(source.charAt(i));

                        Pattern pattern = Pattern.compile("^5[4][0-9]{10}$");
                        Matcher matcher = pattern.matcher(checkMe);
                        boolean valid = matcher.matches();
                        if(!valid){
                            return "";
                        }
                    }
                    return null;
                }
            };

但这只匹配完整数字,我想在用户输入数字时进行验证。

想象一下这种情况:

User enters 6 -> Does not match the initial digit of the pattern so EditText stays empty
User enters 5 -> Matches the first digit of the pattern so EditText text = 5
User enters 3 -> Does not match the second digit of the pattern so EditText text = 5
User enters 4 -> Matches the second digit of the pattern so EditText text = 54
From now, if the user adds a digit, EditText will append that until the length of 10

知道如何实现吗?

使用TextWatcher界面

XML 限制输入类型(数量)和最大字符数(12)

 <EditText
        ....
        android:inputType="number"
        android:maxLength="12" >

Java

editText.addTextChangedListener(new PhoneNumberTextWatcher());

TextWatcher 界面

class PhoneNumberTextWatcher implements TextWatcher {

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            if (s != null && s.length() > 0) {
                String number = s.toString();
                if (number.startsWith("5")) {
                    if (number.length() > 1)
                        if (!number.startsWith("54")) {
                            editText.setText("5");//if second number is not 4
                            editText.setSelection(editText.length()); // move the cursor to 1 position
                        }

                } else
                    editText.setText("");
            }

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    }