Как захватить нажатие клавиш в представлении, добавленном WindowManager - PullRequest
3 голосов
/ 06 февраля 2012

Я хотел бы добавить собственный вид для своего приложения. Для этого я использую 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? Что я должен сделать, чтобы скрыть мой взгляд при нажатой клавише возврата устройства?

Ответы [ 3 ]

2 голосов
/ 31 марта 2013

Вы можете добавить эти setFocusableInTouchMode(true); по вашему мнению

1 голос
/ 11 июля 2012

Просмотры, добавленные диспетчером Windows, не получают событие onKey из-за политики безопасности Android.

0 голосов
/ 28 мая 2019

Я все еще новичок в этом, но я пытаюсь заставить работать подобную функциональность.Вот что помогло мне (в Котлине):

mOverlayView = LayoutInflater.from(this).inflate(R.layout.overlay_layout, null)

val params = WindowManager.LayoutParams(         
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
    // This was the piece I was missing
    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 
        or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, 
    PixelFormat.TRANSLUCENT
)

mWindowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
mWindowManager!!.addView(mOverlayView, params)

mOverlayView!!.isFocusableInTouchMode = true
mOverlayView!!.setOnKeyListener(object : View.OnKeyListener {
    override fun onKey(v: View?, keyCode: Int, event: KeyEvent?): Boolean {
        // Custom code here...
        return true
    }
}
...