Android 6.0设置错误后无法编辑TextInputEditText的问题求助
问题原因分析
我之前碰到过类似的情况,这其实不是TextInputEditText的误用,而是你在事件处理上踩了个小坑!
你设置的OnKeyListener返回了true,这会直接消费掉按键事件——也就是说系统自带的输入处理逻辑拿不到这个事件了。在Android 5.1.1和模拟器上,系统可能对这种情况做了兼容处理,但在Android 6.0的三星设备上(三星的定制系统对事件传递的判断更严格),这种事件拦截直接导致输入无法被处理,所以字段就变成了不可编辑状态。
另外还有个小细节:你直接给TextInputEditText设置error,其实违背了Material Design组件的设计初衷——TextInputLayout才是负责管理提示、错误信息的容器,TextInputEditText只需要专注于输入功能。
解决办法
方法1:修正OnKeyListener的返回值
最简单的修复就是把OnKeyListener的返回值改成false,这样按键事件会继续传递给系统的输入处理逻辑,既可以清除错误提示,又不影响正常输入:
confirmPassword.setOnKeyListener { _, _, _ -> confirmPassword.error = null false // 改为false,不消费事件,让系统处理输入 }
方法2:改用TextInputLayout管理错误提示(推荐)
既然用了TextInputLayout,就应该充分利用它的功能,这样不仅能避免事件拦截的问题,还能获得更符合Material Design的视觉效果:
- 先给你的
TextInputLayout设置一个id(比如@+id/confirmPasswordLayout),然后获取实例:
val confirmPasswordLayout = findViewById<TextInputLayout>(R.id.confirmPasswordLayout)
- 验证时把错误提示设置到
TextInputLayout上:
if(confirmPassword.text.toString() != password.text.toString()) { confirmPasswordLayout.error = "Passwords don't match" valid = false }
- 用
TextWatcher监听输入来清除错误(比OnKeyListener更可靠,能覆盖粘贴、输入法联想等所有输入场景):
confirmPassword.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { confirmPasswordLayout.error = null } override fun afterTextChanged(s: Editable?) {} })
补充说明
这个问题不算官方已知Bug,更多是组件使用方式和事件处理逻辑的细节问题。不同厂商的系统定制(比如三星的TouchWiz)对事件传递的判断有细微差异,所以才会在特定设备上暴露出来。
内容的提问来源于stack exchange,提问作者Sebastien
相关产品推荐
相关产品推荐

