Kotlin中如何使用TextWatcher控制验证按钮可用性并校验输入内容
双EditText输入校验+按钮状态联动实现方案
核心逻辑说明
你原有代码的问题在于仅监听了单个输入框、只做了非空判断,没有同时校验姓名和邮箱两个输入的合规性,也没有实现邮箱格式校验。以下是完整实现方案:
1. 先定义校验规则方法
// 校验firstname规则:不为空、不能全是空格 private fun isFirstNameValid(name: String): Boolean { return name.trim().isNotEmpty() } // 校验邮箱规则:符合name@xxx.com格式 private fun isEmailValid(email: String): Boolean { // 正则可根据业务需求调整,当前已覆盖常见邮箱格式要求 val emailPattern = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" return email.trim().matches(emailPattern.toRegex()) }
2. 定义统一的TextWatcher监听器
两个输入框共用同一个监听器,任意一方输入变化时都同时校验两个输入的合规性,再更新按钮状态:
// 初始化时先将按钮设置为禁用状态 button.isEnabled = false val inputWatcher = object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} override fun afterTextChanged(s: Editable?) { // 实时获取两个输入框的内容 val firstName = etFirstName.text.toString() val email = etEmail.text.toString() // 只有两个输入都符合规则时才启用按钮 button.isEnabled = isFirstNameValid(firstName) && isEmailValid(email) } }
3. 给两个输入框都绑定监听器
etFirstName.addTextChangedListener(inputWatcher) etEmail.addTextChangedListener(inputWatcher)
可选优化
如果需要给firstname增加额外规则(比如长度不超过20位、不能包含特殊字符),直接修改isFirstNameValid方法的判断逻辑即可,不需要改动监听器内部代码。
内容的提问来源于stack exchange,提问作者zou naa
相关产品推荐
相关产品推荐

