TextInputLayout errorview не удаляется при удалении сообщения об ошибке
У меня есть вертикальная линейная компоновка с некоторыми полями ввода. Используя TextInputLayout, я получаю хороший поток с метками и встроенными сообщениями об ошибках. Моя проблема, когда я добавляю и удаляю сообщения об ошибках.
Если я добавляю сообщение об ошибке, оно располагается под текстом редактирования, и все выглядит хорошо.
Если я удаляю сообщение об ошибке с помощью setError(null), сообщение удаляется, но место остается. По-видимому, это дизайн для Google (см. https://code.google.com/p/android/issues/detail?id=176005). Мне бы очень хотелось, чтобы это пространство было удалено, так как интерфейс выглядит очень неправильно.
Если я сделаю.setErrorEnabled(false), представление будет удалено, и все снова будет выглядеть нормально. Однако, если пользователь изменяет данные, а я делаю еще одну setError, сообщение об ошибке не отображается (только строка редактирования текста красная).
3 ответа
Начиная с версии 23.1.1 библиотеки поддержки (и, возможно, ранее), это больше не должно иметь место. Вы должны быть в состоянии позвонить TextInputLayout.setErrorEnabled(false)
скрыть ошибку TextView и вызов TextInputLayout.setError(error)
теперь внутренне звонит TextInputLayout.setErrorEnabled(true)
если ошибка не нулевая или не пустая. Смотрите фрагмент кода ниже, взятый из библиотеки поддержки:
public void setError(@Nullable CharSequence error) {
if (!mErrorEnabled) {
if (TextUtils.isEmpty(error)) {
// If error isn't enabled, and the error is empty, just return
return;
}
// Else, we'll assume that they want to enable the error functionality
setErrorEnabled(true);
}
...
}
Для меня нижеприведенный код работает нормально.
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(mobileNoInputLayout.isErrorEnabled()){
mobileNoInputLayout.setErrorEnabled(false);
}
}
Для этого я создал расширение Kotlin:
var TextInputLayout.errorMessage: CharSequence?
get() = error
set(errorMessage) = setErrorMessage(errorMessage)
@JvmName("setErrorMessageWithTogglingErrorEnabled")
fun TextInputLayout.setErrorMessage(errorMessage: CharSequence?) {
error = errorMessage
isErrorEnabled = !errorMessage.isNullOrEmpty()
}
Чтобы отобразить сообщение об ошибке:
binding.field.errorMessage = "An error message"
Чтобы удалить сообщение об ошибке:
binding.field.errorMessage = null