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 выше: