textinputedittext personalizar outlined fields error edittext custom color android android-textinputlayout

android - personalizar - textinputlayout color



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

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

Normal:

Con error:

Después de borrar el error:

Después de mirar la fuente, descubrí que están haciendo que la vista sea 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?


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


El código fuente de TextInputLayout muestra lo siguiente: Si necesita borrar el error, simplemente use

til.setErrorEnabled(false);

Esto ocultará el texto del error y estirará el espacio inferior a su tamaño estándar.

En caso de que necesite configurar el error nuevamente, simplemente use

til.setError("Your text");

que llama automáticamente a til.setErrorEnabled(true) ya que supone que necesita la funcionalidad de error.


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


Entonces deberías anularlo así:

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

O intente esto, es decir, en un botón o lo que esté utilizando:

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


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


Mira 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 configurar un mensaje de error mediante setError (CharSequence) significará que este diseño no cambiará de tamaño cuando se muestre un error.

Bien basado en esto, intente configurar setErrorEnabled(true) antes de setError() y establezca setErrorEnabled(false) después de setError(null) .


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 simplemente setError(errorMessage); o setError(null);


Ver this página Google lanzará la solución en la futura versión de la biblioteca de soporte. Dice,

Si desea solucionarlo ahora, puede extender TextInputLayout y anular el método setErrorEnabled() , pero no puedo garantizar la compatibilidad con versiones anteriores. Porque es peligroso cambiar de 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); } } } }


El siguiente código 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) { } });