当设置 "digits" 并输入禁止字符时,EditText 隐藏错误消息

EditText hides error message when "digits" are set and forbidden character entered

我有带 digits

的 EditText
<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)时,错误消息被重置,因为输入被更改,但是 none 的 TextWatcher 方法被调用,可能由于 digits.

我可以在不删除 digits 并且不手动处理 TextWatcher 中的禁止字符的情况下以某种方式修复它?也许有一种方法可以保证在每次输入操作时都会被调用?

我发现输入了错误的按键事件InputFilter。但它会覆盖 xml 中的 maxLength(您可以无休止地输入 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});