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!
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.
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:
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.
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();
}
Plusieurs bonnes options ici, y compris Android.util.Patterns.EMAIL_ADDRESS pour API 8+.
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
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) {
}
});
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"/>
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();
}
// 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();
}