#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});