TextInputLayout.setError () deja espacio vacío después de borrar el error

Recientemente he utilizado TextInputLayout y es el método setError() . El problema que tengo es, cuando setError(null) el error llamando a setError(null) deja mucho espacio vacío en la parte inferior.

Normal:

Normal

Con error:

Con error

Después del error de borrado:

Después de borrar el error

Después de mirar la fuente, me encontré con que están haciendo la vista INVISIBLE lugar de GONE

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

Me pregunto por qué es así? ¿Cómo resolver esto para evitar el espacio vacío?

Echa un vistazo a los documentos para

 public void setErrorEnabled (boolean enabled) 

Dice

Si la funcionalidad de error está habilitada o no en este diseño. Habilitar esta funcionalidad antes de establecer un mensaje de error a través de setError (CharSequence) significa que este diseño no cambiará el tamaño cuando se muestre un error.

Bueno, basándose en esto, intente establecer setErrorEnabled(true) antes de setError() , y, set setErrorEnabled(false) after setError(null) .

El método setErrorEnabled(false) borrará el espacio extra, así que setError(null) después de setError(null) .

Vea esta página. Google publicará la revisión en la futura versión de la biblioteca de soporte técnico. Dice,

Si desea corregirlo ahora, puede extender el TextInputLayout y anular el método setErrorEnabled() , pero no puedo garantizar la compatibilidad con versiones anteriores. Porque su algún peligro para cambiar el estado en 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); } } } } 

No use setErrorEnabled(boolean) , simplemente no muestra el error desde la segunda vez.

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

Entonces sólo setError(errorMessage); O setError(null);

El código siguiente funciona bien

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

Mediante el uso de mTextInputLayout.setErrorEnabled(false); He solucionado este problema

Creo una vista personalizada para evitar el código repetido y sobreescribir el método 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); } } 

Entonces debes anularlo de la siguiente manera:

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

O pruebe esto, por ejemplo, en un botón o lo que esté usando:

 final Button btn = (Button) findViewById(R.id.btn); btn.setVisibility(View.GONE); //<--- makes the button gone 
  • OnClick en el EditText dentro de TextInputLayout, dentro de un RecyclerView
  • TextInputLayout no se muestra cuando se agrega programativamente
  • Etiqueta flotante con dos editText
  • EditText añadido no es un TextInputEditText. Por favor, cambie a usar esa clase en su lugar
  • Android TextInputLayout Cambiar contraseña no visible en la nueva biblioteca de soporte
  • Icono de la izquierda en TextInputLayout
  • Android TextInputLayouts perder texto / contenido al volver en la transacción de fragmentos
  • Cambiar TextInputLayout posición de pista a derecha
  • Alinear la línea de base con un TextView que se envuelve dentro de un TextInputLayout
  • Diferentes etiquetas e indicaciones para TextInputLayout
  • ¿Cómo obtengo espacios pequeños como separador de números en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.