EditText скрывает сообщение об ошибке, когда установлены «цифры» и введен запрещенный символ

#android #android-edittext

#Android #android-edittext

Вопрос:

У меня есть EditText с digits

 <EditText
        ...
        android:digits="0123456789ABCDEFabcdef"
        android:inputType="textCapCharacters|textNoSuggestions" />
  

И я проверяю ошибку ввода в TextWatcher

 editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        Log.d(TAG, "beforeTextChanged");
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.d(TAG, "onTextChanged");
    }

    @Override
    public void afterTextChanged(Editable s) {
        Log.d(TAG, "afterTextChanged");
        try {
            int color = Color.parseColor(s.toString());
        } catch (Exception e){
            editText.setError("Wrong color");
        }
    }
});
  

Но когда я ввожу любой запрещенный символ (например, L ), сообщение об ошибке сбрасывается, потому что ввод был изменен, но ни один из TextWatcher методов не вызывается, вероятно, из-за digits .

Я могу как-то исправить это, не удаляя digits и не обрабатывая вручную запрещенные символы в TextWatcher ? Может быть, есть метод, который гарантированно вызывается при каждом действии ввода?

Ответ №1:

Я обнаружил, что появляются события неправильного нажатия клавиши InputFilter . Но он переопределяет maxLength из xml (вы можете бесконечно вводить символы, определенные в digits ), поэтому его придется создавать вручную в коде.

 InputFilter filter = new InputFilter(){
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        // Check here for input error
        return source;
    }
};
InputFilter.LengthFilter lengthFilter = new InputFilter.LengthFilter(7);
editText.setFilters(new InputFilter[]{hexFilter, lengthFilter});