【问题标题】:Android: OnTextChanged email validation is not working as expectedAndroid:OnTextChanged 电子邮件验证未按预期工作
【发布时间】:2025-12-02 10:35:01
【问题描述】:

我正在使用以下代码来验证电子邮件输入

  private boolean validateEmail(String email) {
        String emailPattern = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$";
        Pattern pattern = Pattern.compile(emailPattern);
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

我在onTextChanged 上执行此操作。代码如下(我用的是ButterKnife

@OnTextChanged(R.id.et_email)
    public void checkCorrectEmail() {
        if (!validateEmail(mEditTextEmail.getText().toString().trim())) {
            isValidated = false;
            mEditTextEmail.setError("Please enter email address");
            mEditTextEmail.requestFocus();
        } else {
            isValidated = true;
        }
    }

问题是它不够智能。例如,如果我输入myemail@gmail.com,它仍然会显示错误消息。但是,如果我输入myemail@gmail.com,然后输入space,然后单击删除space,那么一切都很好,错误消失了。

以前此验证是在按钮的onClick 上进行的。我在这里做错了什么?

【问题讨论】:

    标签: java android android-edittext email-validation


    【解决方案1】:
        @OnTextChanged(R.id.et_email)
            public void checkCorrectEmail () {
                if (!validateEmail(mEditTextEmail.getText().toString().trim())) {
                    isValidated = false;
                    mEditTextEmail.setError("Please enter email address");
                    mEditTextEmail.requestFocus();
                } else {
                    isValidated = true;
                    mEditTextEmail.setError(null);
                }
    }
    

    100% 正常工作

    【讨论】:

    • mEditTextEmail.setError(null);当电子邮件有效时。
    【解决方案2】:

    试试这个:

    @OnTextChanged(R.id.et_email)
    public void checkCorrectEmail() {
        if (!validateEmail(mEditTextEmail.getText().toString().trim())) {
            isValidated = false;
            mEditTextEmail.setError("Please enter email address");
            mEditTextEmail.requestFocus();
        } else {
            mEditTextEmail.setError(null)
            isValidated = true;
        }
    }
    

    清除正确输入的错误

    【讨论】:

    • Gautam 也同时回答了问题及其解决方案
    • 时差
    【解决方案3】:

    使用内置Email 模式检查器方法:

    @OnTextChanged(R.id.et_email)
    public void checkCorrectEmail () {
    if (!Patterns.EMAIL_ADDRESS.matcher(mEditTextEmail.getText().toString()).matches()){
        isValidated = false;
        mEditTextEmail.setError("Please enter a Valid E-Mail Address!");
        mEditTextEmail.requestFocus();
    }else {
        isValidated = true;
        mEditTextEmail.setError(null);
    }
    

    【讨论】: