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
相关产品推荐
相关产品推荐

