如何在使用 "addTextChangedListener" 和 "Character.isLetterOrDigit(s.charAt(i))" 收听时启用文本

How to enable text when listening with "addTextChangedListener" and "Character.isLetterOrDigit(s.charAt(i))"

我在用户插入非 LetterOrDigit 时禁用按钮,并在用户插入 LetterOrDigit 时启用它。

我遇到的问题是,即使用户在非 LetterOrDigit 之后插入一个字母,它也会启用它。但我只想在他删除非LetterOrDigit字符时启用。

我的代码

 name1.addTextChangedListener(new 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) {
            }
            @Override
            public void afterTextChanged(Editable s) {
                for (int i = 0; i < s.length(); i++) {
                    if(name1.getText().toString().length()>16)
                    {
                        register.setClickable(false);
                        mistakeusername.setErrorEnabled(true);
                        mistakeusername.setError("You cant insert more then 16 characters");
                    }else {
                        if (!(Character.isLetterOrDigit(s.charAt(i))||Character.toString(s.charAt(i)).equals("_")))
                        {
                            register.setClickable(false);
                            mistakeusername.setErrorEnabled(true);
                            mistakeusername.setError("Only allowed Digit, Number or '_'");
                        }else{
                            register.setClickable(true);
                            mistakeusername.setErrorEnabled(false);
                            mistakeusername.setError("");
                        }
                    }
                }
            }
         });

我认为你的问题是你应该在 for 之后 break if(!(Character.isLetterOrDigit(s.charAt(i))||Character.toSt‌​ring(s.charAt(i)).eq‌​uals("_"))) 是正确的。

试试这个:

 name1.addTextChangedListener(new 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) {
        }
        @Override
        public void afterTextChanged(Editable s) {
            for (int i = 0; i < s.length(); i++) {
                if(name1.getText().toString().length()>16)
                {
                    register.setClickable(false);
                    mistakeusername.setErrorEnabled(true);
                    mistakeusername.setError("You cant insert more then 16 characters");
                }else {
                    if (!(Character.isLetterOrDigit(s.charAt(i))||Character.toString(s.charAt(i)).equals("_")))
                    {
                        register.setClickable(false);
                        mistakeusername.setErrorEnabled(true);
                        mistakeusername.setError("Only allowed Digit, Number or '_'");
                        break;
                    }else{
                        register.setClickable(true);
                        mistakeusername.setErrorEnabled(false);
                        mistakeusername.setError("");
                    }
                }
            }
        }
     });