王女の守護者は常に騎士で
あり、王女は常に王子を選びます。—広州・14℃・曇りの日・空が暗くなると、あなたは太陽です〜
問題
ボリューム+キーイベントを監視していますが、ダイアログが表示されているため、監視は失敗します。
解決した後:
上記の問題を簡単に解決するには2つの方法があります。以下でそれらを解決する方法について詳しく説明します。
解決
実際、最も根本的な問題は、アクティビティがフォーカスを失うことです。音量+キーを押すと、ACTION_DOWN/ACTION_UP
2つのKeyEventイベントが生成され、最終的にはアクティビティまたはビューによって処理されます。明らかに、ポップアップウィンドウが表示されると、ポップアップウィンドウに現在のフォーカスがあります。また、onKeyUp()メソッドとonKeyDown()メソッドがアクティビティで書き換えられるため、アクティビティはキーイベントを取得できません。
- ポップアップウィンドウの ボタン監視を設定する
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()
メソッドを書き直し、アクティビティコールバック用のインターフェイスを予約して、より柔軟にする必要があります。コード例:
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();
}
}
アクティビティでの使用:
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();
}
});
ここをご覧いただきありがとうございます。お役に立てて光栄です。