Android: ¿Cómo puedo validar la entrada de EditText?

Resuelto Stefan asked hace 54 años • 14 respuestas

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?

Stefan avatar Jan 01 '70 08:01 Stefan
Aceptado

¿Por qué no usas TextWatcher?

Dado que tiene varias EditTextcasillas para validar, creo que las siguientes le convendrán:

  1. Tu actividad implementa android.text.TextWatcherla interfaz.
  2. Agrega oyentes TextChanged a sus cuadros EditText
txt1.addTextChangedListener(this);
txt2.addTextChangedListener(this);
txt3.addTextChangedListener(this);
  1. 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 sayuda 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.

Niks avatar May 18 '2010 09:05 Niks

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 */
    }
});
Christopher Perry avatar Aug 07 '2012 03:08 Christopher Perry