165 votes

Android : Comment valider l'entrée EditText ?

J'ai besoin d'effectuer la validation d'une entrée de formulaire sur une série d'EditTexts. J'utilise des récepteurs OnFocusChangeListeners pour déclencher la validation après que l'utilisateur a tapé dans chacun d'eux, mais cela ne se passe pas comme prévu pour le dernier EditText.

Si je clique sur le bouton "Done" tout en tapant dans l'EditText final, l'InputMethod est déconnecté, mais techniquement le focus n'est jamais perdu sur l'EditText (et donc la validation ne se produit jamais).

Quelle est la meilleure solution ?

Devrais-je surveiller le moment où l'InputMethod se détache de chaque EditText plutôt que le moment où le focus change ? Si oui, comment ?

152voto

Nikhil Patil Points 2494

Pourquoi n'utilisez-vous pas TextWatcher ?

Puisque vous avez un certain nombre de EditText pour être validé, je pense que ce qui suit devrait vous convenir :

  1. Votre activité met en œuvre android.text.TextWatcher interface

  2. Vous ajoutez des écouteurs de TextChanged à vos boîtes d'édition de texte.

    txt1.addTextChangedListener(this);
    txt2.addTextChangedListener(this);
    txt3.addTextChangedListener(this);
  3. Parmi les méthodes redéfinies, vous pouvez utiliser la méthode afterTextChanged(Editable s) comme suit

    @Override
    public void afterTextChanged(Editable s) {
    // validation code goes here
    }

El Editable s ne permet pas vraiment de savoir quel est le texte de la boîte EditText qui est modifié. Mais vous pouvez vérifier directement le contenu des boîtes EditText comme suit

    String txt1String = txt1.getText().toString();
    // Validate txt1String

de la même manière. J'espère que je suis clair et si c'est le cas, ça aide ! :)

121voto

Christopher Perry Points 7972

TextWatcher est un peu verbeux à mon goût, alors j'ai fait quelque chose d'un peu plus facile à avaler :

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 */ }
}

Utilisez-le comme ça :

editText.addTextChangedListener(new TextValidator(editText) {
    @Override public void validate(TextView textView, String text) {
       /* Validation code here */
    }
});

90voto

Donn Felker Points 3501

Si vous souhaitez obtenir de jolies fenêtres pop-up de validation et des images lorsqu'une erreur se produit, vous pouvez utiliser la méthode setError comme je le décris. aquí

25voto

Ragunath Jawahar Points 6124

Afin de réduire la verbosité de la logique de validation, j'ai rédigé un fichier bibliothèque pour Android . Il prend en charge la plupart des validations quotidiennes à l'aide d'annotations et de règles intégrées. Il existe des contraintes telles que @TextRule , @NumberRule , @Required , @Regex , @Email , @IpAddress , @Password etc,

Vous pouvez ajouter ces annotations aux références de vos widgets d'interface utilisateur et effectuer des validations. Il vous permet également d'effectuer des validations de manière asynchrone, ce qui est idéal dans des situations telles que la vérification d'un nom d'utilisateur unique sur un serveur distant.

Il existe un exemple sur le site page d'accueil du projet sur la façon d'utiliser les annotations. Vous pouvez également lire le billet de blog associé où j'ai écrit des exemples de codes sur la façon d'écrire des règles personnalisées pour les validations.

Voici un exemple simple qui illustre l'utilisation de la bibliothèque.

@Required(order = 1)
@Email(order = 2)
private EditText emailEditText;

@Password(order = 3)
@TextRule(order = 4, minLength = 6, message = "Enter at least 6 characters.")
private EditText passwordEditText;

@ConfirmPassword(order = 5)
private EditText confirmPasswordEditText;

@Checked(order = 6, message = "You must agree to the terms.")
private CheckBox iAgreeCheckBox;

La bibliothèque est extensible, vous pouvez écrire vos propres règles en étendant le module Rule classe.

11voto

Daniel Magnusson Points 2945

C'était une bonne solution de aquí

InputFilter filter= new InputFilter() { 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
        for (int i = start; i < end; i++) { 
            String checkMe = String.valueOf(source.charAt(i));

            Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*");
            Matcher matcher = pattern.matcher(checkMe);
            boolean valid = matcher.matches();
            if(!valid){
                Log.d("", "invalid");
                return "";
            }
        } 
        return null; 
    } 
};

edit.setFilters(new InputFilter[]{filter});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X