首先要知道dialog弹出时,dialog获取了当前焦点,activity里面的方法无法获取到back键事件。
在Activity可以通过重写下面四个方法对back事件进行监听,判断event.keyCode 是否等于 KeyEvent.KEYCODE_BACK即可进行相应的处理,但dialog弹出时,dialog获取到焦点,下列四个方法将不再被执行。
1)onKeyDown
2)onKeyUp
3)onBackPressed
4)dispatchKeyEvent
实际中可以通过重写dialog的setOnKeyListener()方法,对back事件进行拦截件,但拦截也存在问题,当dialog弹出与dialog消失back事件处理的不是同一个问题时,可以通过KeyCode进行区分,因为dailog弹出时,只有UP事件出现,但dialog消失时,再次点击back按钮时,Up和Down事件都发生,所以可以通过是否发生down事件对back事件进行区分。
//dialog按键拦截操作(可以写在自定义dialog中也可以写在Activity中)
dialog.setOnKeyListener { dialog, keyCode, event ->
Log.w("xxx", event.action.toString())
if (keyCode == KeyEvent.KEYCODE_BACK && event.repeatCount == 0) {
dialog.dismiss();
}
false
}
//activity中重写dispatchKeyEvent操作
override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
if (event?.keyCode == KeyEvent.KEYCODE_BACK) {
if (event.action == KeyEvent.ACTION_UP) {
Log.w("xxx", "dialog弹出时,back键的操作")
} else {
Log.w("xxx", "dialog消失时,back键的操作")
finish()
}
}
return super.dispatchKeyEvent(event)
}