解决当Activity弹窗后,无法监听到onKeyUp()和onKeyDown()按键事件
Posted Steven Jon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决当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();
);
非常感谢你能看到这里,如果能够帮助到你是我的荣幸!
以上是关于解决当Activity弹窗后,无法监听到onKeyUp()和onKeyDown()按键事件的主要内容,如果未能解决你的问题,请参考以下文章