WindowManagerによって追加されたビューでキー押下をキャプチャする方法

私は自分のアプリケーションのためのカスタムビューを追加したいと思います。このため私はWindowsManagerを使用します:

        final WindowManager wm = getWindowManager();
        final View view = ((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.game_menu, null);
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND | WindowManager.LayoutParams.FLAG_FULLSCREEN;
        lp.dimAmount = (float) 0.6;
        lp.format = PixelFormat.TRANSPARENT;
        lp.windowAnimations = android.R.style.Animation_Dialog;
        view.setOnKeyListener(new OnKeyListener() 
        {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) 
            {
                Log.d("12", "12");
                if (keyCode == KeyEvent.KEYCODE_BACK)
                {
                    wm.removeView(view);//This I need to hide my menu
                }
                return false;
            }
        });
        wm.addView(view, lp);//I add menu like in Angry Birds and other games

しかし、私はこのビューを隠すためのデバイスキーイベントをキャプチャすることはできません。

WindowsManagerによって追加されたビューでキーリスナーが呼び出されないのはなぜですか?デバイスの背面キーを押して私のビューを隠すために何をする必要がありますか?

2

2 答え

これらの setFocusableInTouchMode(true); をビューに追加することができます

2
追加された
その後、私は何を変える必要がありますか?
追加された 著者 rup35h,

Windowsマネージャーが追加したビューは、アンドロイドの安全政治のためにonKeyイベントを受け取っていません。

1
追加された
WindowManagerでビューを追加する代わりに、Relativelayout.addView()を使用します。メニュービューをアクティビティに追加します。
追加された 著者 Nik,
@ rup35h私は、セキュリティ上の制約のため、WindowManagerを通して追加されたビューのキーイベントをリッスンすることはできないと思います。それ以外のアプリケーションでは、透明なビューを追加して、任意のアプリケーションでユーザーの入力を聞くことができます。透明な背景でアクティビティーを開始し、このアクティビティーでアクションを実行することができます。
追加された 著者 Nik,
@エシャーンなぜあなたはFacebookのメッセンジャーがウィンドウマネージャーを通してビューを追加すると思いますか?アクティビティやダイアログウィンドウから表示されることがあります。しかし、私はFacebookのメッセンジャーを使用していないと私は確かに言うことはできません。
追加された 著者 Nik,
@ニックしかし、私はサービスでビューを追加しています。これをどう扱う?
追加された 著者 rup35h,
だからあなたは何をしなければならなかったのですか?
追加された 著者 Ben Harris,
その後、バック・キーを押すと、ポップアップ・メッセンジャー・ビューを閉じることができますか?可能であれば、ウィンドウマネージャに追加されたビューでdispatchKeyEventをオーバーライドすることによって可能です。
追加された 著者 Eshaan,
試してみると、これは次のようなものです: 9to5google.files.wordpress.com/2013/04/… アクティビティやダイアログではないため、バックグラウンドでアクティビティを一時停止しません。アクティビティのビューマネージャに追加されていないことは事実ですが、これはサービスのウィンドウマネージャを使用する場合に可能です。
追加された 著者 Eshaan,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript