Kotlin Android设置TextInputLayout.END_ICON_CLEAR_TEXT后焦点监听失效问题
问题原因
当TextInputLayout设置为END_ICON_CLEAR_TEXT模式时,内部会自动为内嵌的输入控件注册专属焦点变化监听器,用于控制清除图标的显隐逻辑,该操作会直接覆盖你提前给输入控件设置的自定义监听,导致原有回调不触发。
解决方案
调整代码执行顺序,先完成TextInputLayout的清除图标配置,再给输入控件设置自定义焦点监听,同时在自定义监听中优先调用TextInputLayout内部原有监听逻辑,保证清除图标功能正常:
textInputLayout = LayoutInflater.from(activity).inflate(R.layout.textinputlayouttemplate, null) as TextInputLayout val textView = CreateUI._TextView(castToField(field), textInputLayout.context) textInputLayout.addView(textView, layout_wMATCHPARENT_hWRAPCONTENT) textInputLayout.layoutParams = layout_wMATCHPARENT_hWRAPCONTENT textInputLayout.setPadding(0, 0, 0, 0) // 优先配置清除图标模式,让TextInputLayout先注册内部监听 textInputLayout.endIconMode = TextInputLayout.END_ICON_CLEAR_TEXT linearLayout.addView(textInputLayout) if (field.validatefield || field.nextpage != 0) { // 保存TextInputLayout已设置的原有焦点监听 val originalFocusListener = textView.onFocusChangeListener textView.setOnFocusChangeListener { _, hasFocus -> // 先执行原有监听逻辑,保证清除图标显隐正常 originalFocusListener?.onFocusChange(textView, hasFocus) // 执行自定义业务逻辑 if (!hasFocus && !GlobalVar.drawerOpened) { if ((field.mandatory && !textView.text.toString().isNullOrEmpty()) || (!field.mandatory)) { if (field.validatefield) { validateField(field.fieldcode, textView.text.toString(), field.nextpage) } else { _goToNextPageNo = field.nextpage goToNextPageIfExist() } } } } }
补充说明
建议将普通TextView替换为TextInputEditText,这是TextInputLayout官方指定的内嵌输入控件,可避免更多适配问题。
界面示例


内容的提问来源于stack exchange,提问作者Ivan Vetrugno
相关产品推荐
相关产品推荐

