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
Другие вопросы по тегам