You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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官方指定的内嵌输入控件,可避免更多适配问题。

界面示例

界面示例1
界面示例2

内容的提问来源于stack exchange,提问作者Ivan Vetrugno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:21:03