Android:EditText软键盘开启状态下如何处理返回键点击事件
实现方案
软键盘弹出时返回键事件会优先被输入法窗口消费,因此不会触发Activity的onBackPressed回调,可通过以下两种方案实现需求:
方案1:自定义EditText(推荐)
重写EditText的dispatchKeyEventPreIme方法,该方法会在输入法消费按键事件前触发,刚好可以拦截返回键操作:
class BackHandleEditText @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.editTextStyle ) : AppCompatEditText(context, attrs, defStyleAttr) { // 返回键按下且输入法显示时的回调 var onBackWithImeShow: (() -> Unit)? = null override fun dispatchKeyEventPreIme(event: KeyEvent?): Boolean { if (event?.keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) { val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager if (imm.isActive(this)) { onBackWithImeShow?.invoke() } } return super.dispatchKeyEventPreIme(event) } }
在布局中替换原生EditText为该自定义控件,再在Activity中设置回调即可:
val editText = findViewById<BackHandleEditText>(R.id.target_edit_text) editText.onBackWithImeShow = { editText.setText("") }
方案2:Activity全局拦截
如果不想自定义控件,可以直接在Activity中重写dispatchKeyEvent方法全局处理:
override fun dispatchKeyEvent(event: KeyEvent?): Boolean { if (event?.keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) { val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager currentFocus?.let { focusView -> if (focusView is EditText && imm.isActive(focusView)) { focusView.setText("") } } } return super.dispatchKeyEvent(event) }
注意事项
- 两种方案都保留了系统默认隐藏软键盘的逻辑,按下返回键时会同时完成清空输入、收起软键盘两个操作
- 如果你使用Java开发,将上述Kotlin代码转换为对应Java语法即可,核心逻辑完全一致
内容的提问来源于stack exchange,提问作者Kishan Solanki
相关产品推荐
相关产品推荐

