Android: ¿Cómo puedo validar la entrada de EditText?
Necesito realizar una validación de entrada de formulario en una serie de EditTexts. Estoy usando OnFocusChangeListeners para activar la validación después de que el usuario escribe cada uno, pero esto no se comporta como se desea para el último EditText.
Si hago clic en el botón "Listo" mientras escribo en el EditText final, entonces el método de entrada se desconecta, pero técnicamente nunca se pierde el foco en el EditText (por lo que la validación nunca ocurre).
¿Cuál es la mejor solución?
¿Debería monitorear cuándo el método de entrada se desvincula de cada EditText en lugar de cuándo cambia el enfoque? ¿Si es así, cómo?
¿Por qué no usas TextWatcher
?
Dado que tiene varias EditText
casillas para validar, creo que las siguientes le convendrán:
- Tu actividad implementa
android.text.TextWatcher
la interfaz. - Agrega oyentes TextChanged a sus cuadros EditText
txt1.addTextChangedListener(this);
txt2.addTextChangedListener(this);
txt3.addTextChangedListener(this);
- De los métodos anulados, puede utilizar el
afterTextChanged(Editable s)
método de la siguiente manera
@Override
public void afterTextChanged(Editable s) {
// validation code goes here
}
Realmente no Editable s
ayuda a encontrar qué texto del cuadro EditText se está cambiando. Pero puedes verificar directamente el contenido de los cuadros EditText como
String txt1String = txt1.getText().toString();
// Validate txt1String
en el mismo método. Espero ser claro y si lo soy, ¡ayuda! :)
EDITAR: Para un enfoque más limpio, consulte la respuesta de Christopher Perry a continuación.
TextWatcher es un poco detallado para mi gusto, así que hice algo un poco más fácil de digerir:
public abstract class TextValidator implements TextWatcher {
private final TextView textView;
public TextValidator(TextView textView) {
this.textView = textView;
}
public abstract void validate(TextView textView, String text);
@Override
final public void afterTextChanged(Editable s) {
String text = textView.getText().toString();
validate(textView, text);
}
@Override
final public void beforeTextChanged(CharSequence s, int start, int count, int after) { /* Don't care */ }
@Override
final public void onTextChanged(CharSequence s, int start, int before, int count) { /* Don't care */ }
}
Úselo así:
editText.addTextChangedListener(new TextValidator(editText) {
@Override public void validate(TextView textView, String text) {
/* Validation code here */
}
});