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étodosetErrorEnabled()
, pero no puedo garantizar la compatibilidad con versiones anteriores. Porque es peligroso cambiar de estado enTextInputLayout
.
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) {
}
});