Dialog的back事件监听

首先要知道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)
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值