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

EditText设置Focusable为false后改回true无法重新获取焦点怎么办

问题原因

Android 中 setFocusable() 方法仅控制控件是否支持非触摸模式下的焦点获取,不会同步修改触摸模式下的焦点属性。当你将 focusable 设为 false 时,系统会自动将 focusableInTouchMode 也同步置为 false,但反向将 focusable 改回 true 时,系统不会自动恢复 focusableInTouchMode 的值。而 EditText 正常可点击获取焦点的前提是同时开启 focusable 和 focusableInTouchMode 两个属性,缺失后者就会出现属性设为 true 但点击无法获取焦点的问题。

可行解决方案
  • 方案1:同步修改两个焦点属性
    切换 focusable 时同步修改 focusableInTouchMode 属性,即可匹配 EditText 默认的焦点逻辑:
    public void onClick(View v) {
        boolean isFocusable = et.isFocusable();
        et.setFocusable(!isFocusable);
        et.setFocusableInTouchMode(!isFocusable);
        // 需要切换后立刻进入输入状态可添加以下代码
        if (!isFocusable) {
            et.requestFocus();
        }
    }
    
  • 方案2:使用 setEnabled() 控制交互状态
    如果你的需求是整体禁用/启用 EditText,直接调用 setEnabled() 更便捷,系统会自动处理焦点、触摸事件、禁用态样式等所有相关逻辑:
    public void onClick(View v) {
        et.setEnabled(!et.isEnabled());
        if (et.isEnabled()) {
            et.requestFocus();
        }
    }
    
  • 方案3:切换状态后主动唤起输入法
    若需要切换为可编辑状态后立刻弹出输入法,添加以下代码即可:
    // 接方案1的属性切换逻辑
    if (!isFocusable) {
        et.requestFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:15:01