TextInputLayout setErrorEnabled не создает новый объект TextView

Я нашел проблему при создании формы входа. Я показываю некоторые ошибки в моем TextInputLayout и отключает их, когда пользователь правильно заполняет.

пример ошибки

Я установил его с помощью

mTextInputLayout.setError("This field is required");

и отключите его с помощью

mTextInputLayout.setError(null);

Проблема заключается в том, что по-прежнему имеются прокладки пустого объекта TextView, в котором отображается сообщение об ошибке. Поэтому я попытался полностью отключить ошибку, установив

mTextInputLayout.setErrorEnabled(false);

и он работает и выглядит отлично, НО я не могу его снова включить. При вызове

mTextInputLayout.setErrorEnabled(true);
mTextInputLayout.setError("This field is required");

снова Я просто вижу строку чтения, а не сообщение об ошибке, поэтому кажется, что TextView, который показывал сообщение об ошибке, был уничтожен и не был создан снова.

Я читаю здесь, что объекты TextView уничтожаются, когда вызывается setErrorEnabled(false) и кажется, что он не создан снова. Ошибка или функция?

Источник для этого элемента управления еще не доступен в AOSP, поэтому я использовал декомпилятор, встроенный в Android Studio, для изучения кода, чтобы понять, что происходит неправильно. Я обнаружил, что setErrorEnabled() фактически создает и уничтожает объект TextView, тогда как я ожидал, что он просто переключит видимость.

Ответ 1

Если кто-то сталкивается с той же проблемой, я нашел обходное решение, которое отлично работает. Просто установите видимость объекта TextView с ошибкой вкл. И выкл., Не уничтожайте объект.

Используйте это для включения сообщения об ошибке:

if (textInputLayout.getChildCount() == 2)
    textInputLayout.getChildAt(1).setVisibility(View.VISIBLE);

textInputLayout.setError("This field is required");

и это для отключения сообщения об ошибке:

textInputLayout.setError(null);

if (textInputLayout.getChildCount() == 2)
    textInputLayout.getChildAt(1).setVisibility(View.GONE);

Ответ 2

По версии библиотеки поддержки 23.1.1 (и, возможно, ранее) вызов setErrorEnabled (false) удалит ошибку TextView и заставит TextInputLayout отображать новую ошибку при вызове setError (String).

Однако все еще существует ошибка, при которой дополнительное отступы не удаляются из макета после удаления сообщения об ошибке. Эта ошибка может быть решена с помощью сообщения @dabo выше:

https://code.google.com/p/android/issues/detail?id=200137