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

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);

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

Вызов setErrorEnabled(false) после setError(null),

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

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

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

Другие вопросы по тегам