如何检查EditText中的文本是否为电子邮件地址?

128

如何在不使用JavaScript和正则表达式的情况下检查EditText的文本是否为电子邮件地址? 这里我使用了inputtype="textEmailAddress",这样可以工作,但没有显示错误消息。


2
PointerNull下面的回答难道不是这里合理、现代的答案吗? - Fattie
1
@JoeBlow 是的,我同意,但是“提问者”更改已同意答案的时间是有限的... - angryITguy
20个回答

437

在 Android 2.2+ 上使用以下方法:

boolean isEmailValid(CharSequence email) {
   return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
例如:
EditText emailid = (EditText) loginView.findViewById(R.id.login_email);
String getEmailId = emailid.getText().toString();

// Check if email id is valid or not
if (!isEmailValid(getEmailId)){
    new CustomToast().Show_Toast(getActivity(), loginView,
        "Your Email Id is Invalid.");
}

240
/**
 * method is used for checking valid email id format.
 * 
 * @param email
 * @return boolean true for valid false for invalid
 */
public static boolean isEmailValid(String email) {
    String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(email);
    return matcher.matches();
}

将您的编辑文本字符串传递给此函数。

为了进行正确的电子邮件验证,您需要服务器端身份验证。


注意:现在在Android中有一个内置方法,请参见下面的答案。


7
String 实现了 CharSequence 接口,因此我认为从 emailinputStr 的转换是多余的。 - nuala
随着新的顶级域名长度超过2-4个字符的引入,需要进行更新。只需用“+”替换 {2.4} 即可。(例如,joe@century21.realtor - Dave Owens
在验证电子邮件地址时不要使用正则表达式(请参见https://dev59.com/uHVC5IYBdhLWcg3wtzut#201378) - Thibault D.

13
请遵循以下步骤
第1步:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText_email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_below="@+id/textView_email"
        android:layout_marginTop="40dp"
        android:hint="Email Adderess"
        android:inputType="textEmailAddress" />

    <TextView
        android:id="@+id/textView_email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:text="Email Validation Example" />

</RelativeLayout>

步骤 2:

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

步骤3:

public class MainActivity extends Activity {

private EditText email;

private String valid_email;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initilizeUI();
}

/**
 * This method is used to initialize UI Components
 */
private void initilizeUI() {
    // TODO Auto-generated method stub

    email = (EditText) findViewById(R.id.editText_email);

    email.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

            // TODO Auto-generated method stub
            Is_Valid_Email(email); // pass your EditText Obj here.
        }

        public void Is_Valid_Email(EditText edt) {
            if (edt.getText().toString() == null) {
                edt.setError("Invalid Email Address");
                valid_email = null;
            } else if (isEmailValid(edt.getText().toString()) == false) {
                edt.setError("Invalid Email Address");
                valid_email = null;
            } else {
                valid_email = edt.getText().toString();
            }
        }

        boolean isEmailValid(CharSequence email) {
            return android.util.Patterns.EMAIL_ADDRESS.matcher(email)
                    .matches();
        } // end of TextWatcher (email)
    });

}

}

12

我编写了一个扩展EditText的库,它本身支持一些验证方法,并且非常灵活。目前原生支持(通过xml属性)的验证方法有:

  1. regexp:用于自定义正则表达式
  2. numeric:仅接受数字字段
  3. alpha:仅接受字母字段
  4. alphaNumeric:猜猜是什么?
  5. email:检查字段是否为有效电子邮件
  6. creditCard:使用Luhn算法检查字段是否包含有效的信用卡
  7. phone:检查字段是否包含有效的电话号码
  8. domainName:检查字段是否包含有效的域名(在API Level < 8中始终通过测试)
  9. ipAddress:检查字段是否包含有效的IP地址 webUrl:检查字段是否包含有效的URL(在API Level < 8中始终通过测试)
  10. nocheck:不检查任何内容(默认)

您可以在此处查看: https://github.com/vekexasia/android-form-edittext

希望你喜欢 :)

在我链接的页面中,您还可以找到电子邮件验证的示例。这里将复制相关片段:

<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"
       />  

这个库还有一个测试应用程序。

这是一个验证电子邮件字段的应用程序截图。

通过xml+库完成电子邮件验证


8

正如其中一个答案中提到的,您可以使用以下 Patterns 类:

public final static boolean isValidEmail(CharSequence target) {
    if (target == null) 
        return false;

    return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}

如果您的应用程序支持的 API 级别低于 8,那么您可以简单地将 Patterns.java 文件复制到您的项目中并进行引用。您可以从此链接获取 Patterns.java 的源代码。


5
在这种情况下,您可以使用android.util.Patterns包。
EditText email = (EditText)findViewById(R.id.user_email);

if(Patterns.EMAIL_ADDRESS.matcher(email.getText().toString()).matches())
    Toast.makeText(this, "Email is VALID.", Toast.LENGTH_SHORT).show();
else
    Toast.makeText(this, "Email is INVALID.", Toast.LENGTH_SHORT).show();

3
以下代码对您应该有所帮助。
String email;
check.setOnClickListener(new OnClickListener() {


                public void onClick(View arg0) {

                    checkEmail(email);
                    if (checkMail) {
                        System.out.println("Valid mail Id");
                    }
                }
            });

        }
    }

    public static boolean checkEmail(String email) {

        Pattern EMAIL_ADDRESS_PATTERN = Pattern
                .compile("[a-zA-Z0-9+._%-+]{1,256}" + "@"
                        + "[a-zA-Z0-9][a-zA-Z0-9-]{0,64}" + "(" + "."
                        + "[a-zA-Z0-9][a-zA-Z0-9-]{0,25}" + ")+");
        return EMAIL_ADDRESS_PATTERN.matcher(email).matches();
    }

3

尝试使用这个简单易用的代码进行电子邮件地址验证。

    String email = inputEmail.getText().toString().trim();

    if (!Patterns.EMAIL_ADDRESS.matcher(email).matches())
    {
        inputEmail.setError("Enter Valid Email Address");
        inputEmail.requestFocus();
    }

2

Apache Commons Validator可以像其他答案中提到的那样使用。

步骤1:从这里下载jar文件。

步骤2:将其添加到您的项目库中。

导入:

import org.apache.commons.validator.routines.EmailValidator;

代码如下:
String email = "myName@example.com";
boolean valid = EmailValidator.getInstance().isValid(email);

并允许本地地址:

boolean allowLocal = true;
boolean valid = EmailValidator.getInstance(allowLocal).isValid(email);

2

试试这个:

public boolean isValidEmail(String email) {
    return (PatternsCompat.EMAIL_ADDRESS.matcher(email).matches());
}

谢谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接