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, тогда как я ожидал, что он просто переключит видимость.


person dabo248    schedule 20.10.2015    source источник


Ответы (3)


На случай, если кто-то столкнется с той же проблемой, я нашел обходной путь, который отлично работает. Просто включите и выключите видимость объекта 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);
person dabo248    schedule 20.10.2015
comment
Спасибо, я столкнулся с той же проблемой. Не знаю, почему Google так реализовал, но это ужасно, что setErrorEnabled(true) не работает должным образом -> ошибка не видна после setErrorEnabled(true), если мы вызывали setErrorEnabled(false) до - person Ragaisis; 29.10.2015
comment
Я столкнулся с java.lang.NoClassDefFoundError: Не удалось разрешить: Landroid/support/v7/internal/widget/TintManager; в android.support.design.widget.TextInputLayout.setError(TextInputLayout.java:379) в textInputLayout.setError(null); - person Nikhilesh Patve; 17.03.2016
comment
Вы импортируете библиотеку поддержки Android в свой проект (в файл build.gradle)? зависимости {компилировать 'com.android.support:design:23.1.0'} - person dabo248; 17.03.2016
comment
textInputLayout.getChildAt(1) может вернуть неправильное представление, если вы также используете счетчик. - person Sergei Vasilenko; 06.05.2016

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

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

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

person TheIT    schedule 02.02.2016

В моем случае ошибка установки, ошибка очистки и ошибка установки снова вызвали ошибку. Линия больше не стала красной (API 23.4.0). Это решение помогло: TextInputLayout.setError() оставляет пустое место после очистки ошибка

Позвоните setErrorEnabled(false) после setError(null).

person CoolMind    schedule 11.12.2016