web-dev-qa-db-fra.com

Valider un email dans un EditText

Je veux valider un email introduit dans un EditText et voici le code que j'ai déjà:

final EditText textMessage = (EditText) findViewById (R.id.textMessage);

final TextView text = (TextView) findViewById (R.id.text);

    textMessage.addTextChangedListener(new TextWatcher() { 
        public void afterTextChanged(Editable s) { 
            if (textMessage.getText().toString().matches("[a-zA-Z0-9._-]+@[a-z]+.[a-z]+") && s.length() > 0)
            {
                text.setText("valid email");
            }
            else
            {
                text.setText("invalid email");
            }
        } 
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
        public void onTextChanged(CharSequence s, int start, int before, int count) {} 
    }); 

Le problème est que lorsque j'insère 3 caractères après le "@", le message "e-mail valide" apparaît, lorsqu'il doit apparaître lorsque j'introduis l'e-mail complet.

Toute suggestion?

Merci à tous!

16
KrLx_roller

Modifiez simplement votre expression régulière comme suit:

"[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+"

Parce que . (point) signifie que vous devez faire correspondre une simple barre oblique inversée avant votre point à un seul caractère pour représenter un point réel.

23
Yuanhai Shi

J'ai écrit une bibliothèque qui étend EditText, qui prend en charge de manière native certaines méthodes de validation et est en réalité très flexible. 

Les méthodes de validation actuelles, au moment où j'écris, de manière native (via attributs xml ) sont les suivantes:

  1. regexp : pour une expression rationnelle personnalisée
  2. numérique : pour un champ uniquement numérique
  3. alpha : pour un champ alpha uniquement
  4. alphaNumeric : devinez quoi?
  5. email : vérifie que le champ est un email valide
  6. creditCard : vérifie que le champ contient une carte de crédit valide utilisant l'algorithme de Luhn
  7. phone : vérifie que le champ contient un numéro de téléphone valide
  8. domainName : vérifie que le champ contient un nom de domaine valide (réussit toujours le test au niveau de l'API <8)
  9. ipAddress : vérifie que le champ contient une adresse IP valide webUrl: vérifie que le champ contient une adresse URL valide (réussit toujours le test au niveau API <8)
  10. nocheck : Il ne vérifie rien. (Défaut)

Vous pouvez le vérifier ici: https://github.com/vekexasia/Android-form-edittext

Je espère que vous l'apprécierez :)

Dans la page que j'ai liée, vous pourrez également trouver un exemple de validation de courrier électronique. Je vais copier l'extrait relatif ici:

<com.andreabaccega.widget.FormEditText
       style="@Android:style/Widget.EditText"
       whatever:test="email"
       Android:id="@+id/et_email"
       Android:layout_width="match_parent"
       Android:layout_height="wrap_content"
       Android:hint="@string/hint_email"
       Android:inputType="textEmailAddress"
       />  

Il existe également une application de test présentant les possibilités de la bibliothèque.

Ceci est une capture d'écran de l'application validant le champ email.

email validation done thorugh xml+library

15
Andrea Baccega
public boolean validateEmail(String email) {

Pattern pattern;
Matcher matcher;
String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
pattern = Pattern.compile(EMAIL_PATTERN);
matcher = pattern.matcher(email);
return matcher.matches();

}
5
kyogs

Plusieurs bonnes options ici, y compris Android.util.Patterns.EMAIL_ADDRESS pour API 8+.

https://stackoverflow.com/a/7882950/1011746

3
mindriot

Si vous utilisez l'API 8 ou une version ultérieure, vous pouvez utiliser la classe Patterns facilement disponible pour valider un courrier électronique. Exemple de code:

public final static boolean isValidEmail(CharSequence target) {
    if (target == null) {
        return false;
    } else {
        return Android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
    }
}

Par chance, si vous prenez même en charge un niveau API inférieur à 8, vous pouvez simplement copier le fichier Patterns.Java dans votre projet et le référencer. Vous pouvez obtenir le code source pour Patterns.Java à partir de ce lien

3
Mahendra Liya

Essayez ce modèle .....

editText.addTextChangedListener (new TextWatcher () {

        @Override
        public void afterTextChanged(Editable s) {
            pattern = Pattern.compile(".+@.+\\.[a-z]+");
            matcher = pattern.matcher(editText.getText().toString());

            if(matcher.matches()) {
                Log.i("Test","--------Valid Email--------");
            }else {

                Log.i("Test","--------Invalid Email------");
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        } 
    }); 
1
Kri

Ne le faites pas dans le code. Vous pouvez utiliser l'attribut inputType de EditText.

    <EditText 
        Android:id="@+id/edit_text"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:inputType="textEmailAddress"/>
1
Timuçin
private boolean validateEmailAddress(CharSequence emailAddress)
{

  if( Build.VERSION.SDK_INT >= 8 )
  {
    return Android.util.Patterns.EMAIL_ADDRESS.matcher(emailAddress).matches();
  }

  Pattern pattern;
  Matcher matcher;
  String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
  pattern = Pattern.compile(EMAIL_PATTERN);
  matcher = pattern.matcher(emailAddress);

  return matcher.matches();
}
0
Sonia

// valide ton format d'adresse email. [email protected]

public boolean emailValidator(String email) 
{
    Pattern pattern;
    Matcher matcher;
    final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    pattern = Pattern.compile(EMAIL_PATTERN);
    matcher = pattern.matcher(email);
    return matcher.matches();
}
0
Virag Brahme