解决当Activity弹窗后,无法监听到onKeyUp()和onKeyDown()按键事件

守护公主的永远是骑士,
而公主选择的永远是王子。

— 广州 · 14℃ · 阴天 · 天暗下来,你就是阳光~

问题

监听音量+按键事件,但由于Dialog显示时,监听失败:

问题展示:

解决后:

在这里插入图片描述

有两种方式轻松解决上面的问题,下面我会详细讲述如何解决的。

解决办法

其实最根本的问题就是Activity失去焦点了,当我按下音量+键时,会产生ACTION_DOWN/ACTION_UP两个KeyEvent事件分发,最终交由Activity或者View处理,很明显当弹窗显示时,弹窗获取了当前焦点,而onKeyUp()和onKeyDown()方法是重写在Activity里,因此Activity是无法获取到按键事件的。

  • 给弹窗设置 setOnKeyListener() 按键监听

这个是最简单的解决办法,代码示例:

        
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        dialog = builder.create();
        dialog.setTitle("弹窗示例");
        dialog.setView(view, 0, 0, 0, 0);
        dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                //指定按键事件:监听音量+键松开事件
                if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && event.getAction() == KeyEvent.ACTION_UP) {
                    // TODO: 2021/3/21
                   Toast.makeText(this, "音量+键 被点击!", Toast.LENGTH_SHORT).show();
                }
                return false;
            }
        });

  • 重写弹窗的dispatchKeyEvent事件

这个方法稍微复杂点,需要先新建一个MyDialog,继承AlertDialog,然后重写dispatchKeyEvent()方法,预留接口给Activity回调,使其更加灵活,代码示例:

MyDialog类


public class MyDialog extends AlertDialog {

    public MyDialog(Context mContext) {
        super(mContext);
    }

    @Override
    public boolean dispatchKeyEvent(android.view.KeyEvent event) {
        //指定按键事件:监听音量+键松开事件
        if (event.getKeyCode() == android.view.KeyEvent.KEYCODE_VOLUME_UP && event.getAction() == KeyEvent.ACTION_UP) {
            if (mKeyEventListener != null) mKeyEventListener.onKeyEvent();
        }
        return super.dispatchKeyEvent(event);
    }

    private OnKeyEventListener mKeyEventListener;
    public void setOnKeyEventListener(OnKeyEventListener mKeyEventListener) {
        this.mKeyEventListener = mKeyEventListener;
    }
    public interface OnKeyEventListener {
        void onKeyEvent();
    }
}


在Activity里使用:


        myDialog = new MyDialog(this);
        myDialog.setTitle("自定义弹窗");
        myDialog.setView(view, 0, 0, 0, 0);
        myDialog.setOnKeyEventListener(new MyDialog.OnKeyEventListener() {
            @Override
            public void onKeyEvent() {
                // TODO: 2021/3/21
                Toast.makeText(this, "音量+键 被点击!", Toast.LENGTH_SHORT).show();
            }
        });
        

非常感谢你能看到这里,如果能够帮助到你是我的荣幸!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值