Intereting Posts
Android: Как организовать ресурсы проекта? File.deleteOnExit – трюк Unix из комментариев ADT 22.3 (android 4.4) – получение ошибки «После создания сцены, #init () необходимо вызвать" Централизованные и децентрализованные порталы мобильных приложений Android-приложение с базой данных постоянно «запускает / ожидает блокировку gc alloc» Получите расширение файла из изображений, выбранных из галереи или камеры, в виде строки Связь с клиентским сервером Android Java.lang.IllegalArgumentException: путь не должен быть пустым в Picasso Android webview.loadUrl не загружает другую веб-страницу Android – java – WeakReferences с ArrayList? Выбирайте арабскую / урдускую пользовательскую клавиатуру на Edittext Issue Попытка добавить adb к переменной PATH OSX Как найти последнюю активность, с которой текущая активность открывается в android? Как изменить фон диалоговых окон Android alert? Android – освобождение выделенной памяти AnimationDrawable использует

TextInputLayout.setError () оставляет пустое пространство после устранения ошибки

Недавно я использовал TextInputLayout и метод setError() . Проблема, которую я получаю, когда я setError(null) ошибку, вызывая setError(null) она оставляет столько свободного места внизу.

Нормальный:

Нормальный

С ошибкой:

С ошибкой

После устранения ошибки:

После устранения ошибки

Посмотрев на источник, я обнаружил, что они делают вид INVISIBLE вместо GONE

 .setListener(new ViewPropertyAnimatorListenerAdapter() { @Override public void onAnimationEnd(View view) { view.setVisibility(INVISIBLE); // here it is updateLabelVisibility(true); } }).start(); 

Мне интересно, почему это так? Как решить эту проблему, чтобы избежать пустого пространства?

Solutions Collecting From Web of "TextInputLayout.setError () оставляет пустое пространство после устранения ошибки"

Ознакомьтесь с документами для

 public void setErrorEnabled (boolean enabled) 

Это говорит

Независимо от того, включена ли функция ошибки или нет в этом макете. Включение этой функции перед установкой сообщения об ошибке через setError (CharSequence) означает, что этот макет не изменит размер при отображении ошибки.

На основе этого попробуйте установить setErrorEnabled(true) перед setError() и установить setErrorEnabled(false) после setError(null) .

Метод setErrorEnabled(false) очистит дополнительное пространство, поэтому вызовите его после setError(null) .

См. Эту страницу. Google выпустит исправление в будущей версии библиотеки поддержки. В нем говорится,

Если вы хотите исправить это сейчас, вы можете setErrorEnabled() TextInputLayout и переопределить метод setErrorEnabled() , но я не могу гарантировать обратную совместимость. Потому что его некоторая опасность изменить состояние в TextInputLayout .

 public class TextInputLayout extends android.support.design.widget.TextInputLayout{ public TextInputLayout(Context context) { super(context); } public TextInputLayout(Context context, AttributeSet attrs) { super(context, attrs); } public TextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setErrorEnabled(boolean enabled) { super.setErrorEnabled(enabled); if (enabled) { return; } if (getChildCount() > 1) { View view = getChildAt(1); if (view != null) { view.setVisibility(View.GONE); } } } } 

Не используйте setErrorEnabled(boolean) , он просто не обнаруживает ошибку со второго раза.

 public class MyTextInputLayout extends android.support.design.widget.TextInputLayout { public MyTextInputLayout(Context context) { super(context); } public MyTextInputLayout(Context context, AttributeSet attrs) { super(context, attrs); } public MyTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setError(@Nullable CharSequence error) { super.setError(error); View layout = getChildAt(1); if (layout != null) { if (error != null && !"".equals(error.toString().trim())) { layout.setVisibility(VISIBLE); } else { layout.setVisibility(GONE); } } } } 

Затем просто setError(errorMessage); Или setError(null);

Следующий код работает отлично

  textInputLatout.getEditText().addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() < 1) { textInputLayout.setErrorEnabled(true); textInputLayout.setError("Please enter a value"); } if (s.length() > 0) { textInputLayout.setError(null); textInputLayout.setErrorEnabled(false); } } @Override public void afterTextChanged(Editable s) { } }); 

Используя mTextInputLayout.setErrorEnabled(false); Я решил эту проблему

Я создаю пользовательское представление, чтобы избежать повторного кода и переопределить метод setError .

  public class UserInputView extends TextInputLayout { public UserInputView(Context context) { this(context, null); } public UserInputView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public UserInputView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setError(@Nullable CharSequence error) { boolean isErrorEnabled = error != null; setErrorEnabled(isErrorEnabled); super.setError(error); } } 

Затем вы должны переопределить его так:

 @Override public void onAnimationEnd(View view) { view.setVisibility(GONE); // <-- this is where you make it GONE updateLabelVisibility(true); } 

Или попробуйте это, например, на кнопке или любом другом, что вы используете:

 final Button btn = (Button) findViewById(R.id.btn); btn.setVisibility(View.GONE); //<--- makes the button gone