You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Registration Activity密码与确认密码校验提示不显示问题求助

问题描述

我开发了一个注册页面(Registration Activity),用户名、邮箱的校验功能正常,但密码和确认密码的Toast提示或错误信息完全不显示。最初我为用户名、邮箱、密码、确认密码分别编写校验方法,出现Toast提示中断的问题,于是将所有校验逻辑合并到一个方法中,但密码相关的问题依然存在。

界面截图:
注册页面

原代码

package com.example.foodeezfavourite;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.material.textfield.TextInputEditText;
public class RegistrationActivity extends AppCompatActivity {

    TextInputEditText registrationUserName;
    EditText registrationEmail, registrationPassword, registrationConfirmPassword;
    Button registrationButton;
    String userName, email, password, confirmPassword, emailPattern, passwordPattern;

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

        registrationUserName = findViewById(R.id.edRegisterUserName);
        registrationEmail = findViewById(R.id.edRegisterEmail);
        registrationPassword = findViewById(R.id.edRegisterPassword);
        registrationConfirmPassword = findViewById(R.id.edRegisterConfirmPassword);
        registrationButton = findViewById(R.id.btnRegisterButton);

        registrationButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                userName = registrationUserName.getText().toString();
                email = registrationEmail.getText().toString();
                password = registrationPassword.getText().toString();
                confirmPassword = registrationConfirmPassword.getText().toString();
                emailPattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+";
                passwordPattern = "^(?=.*[0-9])(?=.*[A-Z])(?=.*[@#$%^&+=!])(?=\\S+$).{4,}$";

                validationProcess();
            }
        });

    }

    public void validationProcess() {
        if (TextUtils.isEmpty(userName) && TextUtils.isEmpty(email) && TextUtils.isEmpty(password) && TextUtils.isEmpty(confirmPassword)) {
            Toast.makeText(getApplicationContext(), "Please fill all details", Toast.LENGTH_SHORT).show();
        } else if (TextUtils.isEmpty(userName)) {
            Toast.makeText(getApplicationContext(), "Username field is Empty", Toast.LENGTH_SHORT).show();
        } else if (userName.length() < 3) {
            registrationUserName.setError("Username must be at least 3 letters long");
        } else if (userName.length() > 12) {
            registrationUserName.setError("Username must be less than 12 letters");
        } else if (TextUtils.isEmpty(email)) {
            Toast.makeText(getApplicationContext(), "Email field is Empty", Toast.LENGTH_SHORT).show();
        } else if (!email.matches(emailPattern)) {
            registrationEmail.setError("Invalid Email Address");
            Toast.makeText(getApplicationContext(), "Email must contain at least 1 Uppercase letter, " + "1 lowercase letter, 1 number & 1 special character", Toast.LENGTH_SHORT).show();
        } else if (email.matches(emailPattern)) {
            registrationEmail.setError(null);
        } else if (TextUtils.isEmpty(password)) {
            Toast.makeText(getApplicationContext(), "Password field is Empty", Toast.LENGTH_SHORT).show();
        } else if (!password.matches(passwordPattern)) {
            registrationPassword.setError("Invalid Password");
            Toast.makeText(getApplicationContext(), "Password must contain at least 1 Uppercase letter, " + "1 lowercase letter, 1 number & 1 special character", Toast.LENGTH_SHORT).show();
        } else if (password.matches(passwordPattern)) {
            registrationPassword.setError(null);
        } else if (password.compareTo(confirmPassword) == 0) {
            registrationPassword.setError(null);
        } else if (password.compareTo(confirmPassword) != 0) {
            registrationPassword.setError("Passwords does not match");
        } else if (TextUtils.isEmpty(confirmPassword)) {
            Toast.makeText(getApplicationContext(), "Confirm Password field is Empty", Toast.LENGTH_SHORT).show();
        }
    }
}
问题分析与修复

核心问题

密码校验逻辑完全没执行,原因是**else if的顺序错误**:当邮箱格式正确时,else if (email.matches(emailPattern))分支会被触发,执行完清除邮箱错误的操作后,整个else if链直接终止,后续的密码、确认密码校验代码根本不会运行。

修复方案

  1. 移除冗余分支:删除else if (email.matches(emailPattern))这个多余分支,直接在邮箱格式校验通过时清除错误。
  2. 调整校验逻辑结构:把每个输入项的校验拆成独立的if块(而非else if链),这样可以同时提示多个错误,避免提前终止后续校验。
  3. 修正校验顺序:确认密码的非空校验要放在密码匹配判断之前,避免被前置逻辑挡住。
  4. 优化字符串相等判断:用equals()替代compareTo()判断密码是否一致,更符合Java编码习惯。

修复后的validationProcess()方法

public void validationProcess() {
    boolean isValid = true;
    Context context = RegistrationActivity.this;

    // 用户名校验
    if (TextUtils.isEmpty(userName)) {
        Toast.makeText(context, "用户名不能为空", Toast.LENGTH_SHORT).show();
        isValid = false;
    } else if (userName.length() < 3) {
        registrationUserName.setError("用户名至少3个字符");
        isValid = false;
    } else if (userName.length() > 12) {
        registrationUserName.setError("用户名不能超过12个字符");
        isValid = false;
    } else {
        registrationUserName.setError(null);
    }

    // 邮箱校验
    if (TextUtils.isEmpty(email)) {
        Toast.makeText(context, "邮箱不能为空", Toast.LENGTH_SHORT).show();
        isValid = false;
    } else if (!email.matches(emailPattern)) {
        registrationEmail.setError("邮箱格式无效");
        Toast.makeText(context, "请输入正确的邮箱格式", Toast.LENGTH_SHORT).show();
        isValid = false;
    } else {
        registrationEmail.setError(null);
    }

    // 密码校验
    if (TextUtils.isEmpty(password)) {
        Toast.makeText(context, "密码不能为空", Toast.LENGTH_SHORT).show();
        isValid = false;
    } else if (!password.matches(passwordPattern)) {
        registrationPassword.setError("密码格式无效");
        Toast.makeText(context, "密码必须包含至少1个大写字母、1个小写字母、1个数字和1个特殊字符,且不少于4位", Toast.LENGTH_SHORT).show();
        isValid = false;
    } else {
        registrationPassword.setError(null);
    }

    // 确认密码校验
    if (TextUtils.isEmpty(confirmPassword)) {
        Toast.makeText(context, "确认密码不能为空", Toast.LENGTH_SHORT).show();
        isValid = false;
    } else if (!password.equals(confirmPassword)) {
        registrationConfirmPassword.setError("两次输入的密码不一致");
        isValid = false;
    } else {
        registrationConfirmPassword.setError(null);
    }

    // 校验通过后的逻辑
    if (isValid) {
        Toast.makeText(context, "注册成功", Toast.LENGTH_SHORT).show();
        // 这里可以添加跳转到登录页等逻辑
        // startActivity(new Intent(context, LoginActivity.class));
    }
}

额外优化建议

  • 将emailPattern和passwordPattern定义为类常量,避免每次点击按钮都重新创建:
    private static final String EMAIL_PATTERN = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+";
    private static final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[A-Z])(?=.*[@#$%^&+=!])(?=\\S+$).{4,}$";
    
  • 使用RegistrationActivity.this替代getApplicationContext(),避免Toast显示异常。

内容的提问来源于stack exchange,提问作者touqeer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 10:12:58