添加dispatchTouchEvent后,Android返回键直接关应用而非先关键盘的解决方法
解决方案
首先修正你当前的dispatchTouchEvent代码,避免点击SearchView本身时也触发隐藏键盘的逻辑:
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { if (ev?.action == MotionEvent.ACTION_DOWN) { val view = currentFocus if (view is EditText) { // SearchView内部的输入框属于EditText子类 val outRect = Rect() view.getGlobalVisibleRect(outRect) if (!outRect.contains(ev.rawX.toInt(), ev.rawY.toInt())) { val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(view.windowToken, 0) view.clearFocus() } } } return super.dispatchTouchEvent(ev) }
接下来重写onBackPressed方法,实现返回键先关闭键盘再关闭页面的逻辑:
override fun onBackPressed() { val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val currentFocusView = currentFocus // 判断键盘是否处于显示状态,且当前有焦点控件 if (currentFocusView != null && imm.isActive(currentFocusView)) { imm.hideSoftInputFromWindow(currentFocusView.windowToken, 0) currentFocusView.clearFocus() } else { // 键盘已关闭,执行默认的返回逻辑(关闭Activity) super.onBackPressed() } }
逻辑说明
- 修正后的
dispatchTouchEvent只会在点击SearchView外部区域时隐藏键盘,不会影响点击SearchView本身的正常输入。 onBackPressed方法中,先检查键盘是否激活且有焦点控件:如果是,就隐藏键盘并清除焦点;如果键盘已经关闭,再执行默认的返回关闭Activity操作。
内容的提问来源于stack exchange,提问作者jane
相关产品推荐
相关产品推荐

