アクティビティがポップアップしたときにonKeyUp()およびonKeyDown()キーイベントを監視できないという問題を解決します

王女の守護者は常に騎士で
あり、王女は常に王子を選びます。

—広州14℃曇りの日空が暗くなると、あなたは太陽です〜

問題

ボリューム+キーイベントを監視していますが、ダイアログが表示されているため、監視は失敗します。

問題表示:

解決した後:

ここに画像の説明を挿入します

上記の問題を簡単に解決するには2つの方法があります。以下でそれらを解決する方法について詳しく説明します。

解決

実際、最も根本的な問題は、アクティビティがフォーカスを失うことです。音量+キーを押すと、ACTION_DOWN/ACTION_UP2つの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();
            }
        });
        

ここをご覧いただきありがとうございます。お役に立てて光栄です。

おすすめ

転載: blog.csdn.net/qq_36270361/article/details/115047495