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链直接终止,后续的密码、确认密码校验代码根本不会运行。
修复方案
- 移除冗余分支:删除
else if (email.matches(emailPattern))这个多余分支,直接在邮箱格式校验通过时清除错误。 - 调整校验逻辑结构:把每个输入项的校验拆成独立的
if块(而非else if链),这样可以同时提示多个错误,避免提前终止后续校验。 - 修正校验顺序:确认密码的非空校验要放在密码匹配判断之前,避免被前置逻辑挡住。
- 优化字符串相等判断:用
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
相关产品推荐
相关产品推荐

