Android注册页密码不匹配不报错、字母数字密码校验失效如何解决?
问题原因及修复方案
核心bug1:密码正则校验逻辑错误
你当前使用String.contains()方法做正则匹配,这个方法仅判断是否包含指定普通子串,不支持正则规则解析,所以即便输入了符合字母+数字要求的密码,该方法仍会返回false,导致密码格式错误提示一直触发。
核心bug2:错误提示无清除逻辑
你在LiveData观察者中仅处理了错误不为空的场景,当用户修正输入后,对应输入框的错误提示没有被清空,旧错误会一直保留。
可选优化:单错误返回逻辑体验差
当前的if-else if判断逻辑一次仅能返回一个错误,用户需要修复完前一个错误才能看到下一个提示,交互体验不佳。
修复代码
1. 修正ViewModel密码校验方法
// A placeholder password validation check private fun isPasswordValid(password: String): Boolean { // 改用matches方法做正则匹配,需要将字符串转为Regex类型 return password.matches("^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$".toRegex()) }
2. 修正Fragment错误提示逻辑,新增错误清除能力
signUpViewModel.signUpFormState.observe(viewLifecycleOwner, Observer { val signUpState = it ?: return@Observer // disable sign up button unless fields are valid signupButton.isEnabled = signUpState.isDataValid // 用空安全调用简化逻辑,无错误时自动赋值null清空提示 emailInput.error = signUpState.emailError?.let { getString(it) } passwordInput.error = signUpState.passwordError?.let { getString(it) } confirmPasswordInput.error = signUpState.confirmPasswordError?.let { getString(it) } })
3. (可选)修改ViewModel校验逻辑,支持同时返回所有错误
fun signUpDataChanged(email:String, password: String, confirmPassword: String) { var emailError: Int? = null var passwordError: Int? = null var confirmPasswordError: Int? = null var isDataValid = true if (!isEmailValid(email)) { emailError = R.string.invalid_email isDataValid = false } if (!isPasswordValid(password)) { passwordError = R.string.invalid_password_signUp isDataValid = false } if (!passwordsMatch(password,confirmPassword)){ confirmPasswordError = R.string.mismatched_password isDataValid = false } _signUpForm.value = SignUpFormState( emailError = emailError, passwordError = passwordError, confirmPasswordError = confirmPasswordError, isDataValid = isDataValid ) }
内容的提问来源于stack exchange,提问作者dazai
相关产品推荐
相关产品推荐

