Android中Edittext切换焦点后隐藏软键盘问题求助
Android EditText切换时禁止软键盘弹出解决方案
原代码问题
- edittext2的触摸回调中错误调用了
edittext1.requestfocus(),没有将焦点给到被触摸的edittext2,不符合切换焦点的需求 - 隐藏软键盘的调用时机晚于系统默认弹出软键盘的触发逻辑,导致隐藏操作后软键盘又被系统重新拉起
- 使用
getCurrentFocus().getWindowToken()存在空指针风险,且没有覆盖长按拖拽抬起后的软键盘触发场景
优先方案(兼容Android 5.0/API 21及以上,覆盖99%现役设备)
直接从系统层面禁止EditText获得焦点时自动弹出软键盘,从根源覆盖所有触发场景:
XML配置方式
在布局文件中给两个EditText添加属性:
<EditText android:id="@+id/edittext1" ... android:showSoftInputOnFocus="false" /> <EditText android:id="@+id/edittext2" ... android:showSoftInputOnFocus="false" />
动态代码配置方式
edittext1.setShowSoftInputOnFocus(false); edittext2.setShowSoftInputOnFocus(false);
该配置会自动覆盖所有需求场景:点击切换焦点、长按拖拽抬起后都不会弹出软键盘,如果后续需要主动弹出软键盘,手动调用InputMethodManager的show方法即可。
兼容方案(支持Android 5.0以下的旧设备)
如果需要适配更低版本系统,通过统一的触摸监听器+焦点变更监听器实现:
// 统一触摸监听器 View.OnTouchListener editTextTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 给当前被触摸的EditText请求焦点 v.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); if (imm != null) { // 直接使用当前View的windowToken,避免空指针 imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } // 处理长按拖拽抬起的场景 if (event.getAction() == MotionEvent.ACTION_UP) { if (v.isPressed()) { v.setPressed(false); } if (imm != null) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } // 不消费事件,保留EditText的拖拽、文本选择等原有功能 return false; } }; // 统一焦点变更监听器 View.OnFocusChangeListener editTextFocusListener = new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } } }; // 给两个EditText设置监听器 edittext1.setOnTouchListener(editTextTouchListener); edittext1.setOnFocusChangeListener(editTextFocusListener); edittext2.setOnTouchListener(editTextTouchListener); edittext2.setOnFocusChangeListener(editTextFocusListener);
内容的提问来源于stack exchange,提问作者KaiAkiho
相关产品推荐
相关产品推荐

