2012-06-26 3 views
5

У меня есть основное действие, которое не использует меню опций. Мне нужно реализовать это поведение: 1. Когда нажата кнопка «Меню Android», отображается всплывающее окно 2. При повторном нажатии кнопки «Меню Android» всплывающее окно отклоняется.Перехват кнопки меню Android в PopupWindow

Я знаю, как сделать # 1, переопределив onKeyDown() в основном действии, но не знаю, как сделать # 2. Когда всплывающее окно отображается, onKeyDown() основного действия больше не запускается.

Как захватить кнопку Android-меню, когда основное действие имеет открытое всплывающее окно? (в моем случае всплывающее окно представляет собой PopupWindow с завышенным представлением).

Кстати, я попытался установить ключ слушателя на главном виде всплывающего окна, но это не срабатывает

mTopView.setOnKeyListener(new View.OnKeyListener() {   
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      LogUtil.debug("*** Key: %d", keyCode); 
      return false; 
     } 
    }); 
+1

Если бы это был я, я бы включил «всплывающее окно» в свою деятельность, таким образом это можно сделать так же, как и в MainActivity. Просто вызовите финиш(), когда во всплывающем меню нажата кнопка. – FoamyGuy

+0

Спасибо. У меня есть много кода, вложенных в всплывающее решение (его нужно всплывать в определенном месте и формировать относительно привязанного представления). Если я не найду способ заставить его работать, я попытаюсь применить подход к работе. – user1139880

ответ

14

Отвечая на мой собственный вопрос. Вызов setFocusableInTouchMode() в представлении PopupWindow делает трюк и заставляет слушателя работать.

PopupMenu popupMenu = ... 
... 
popupWindow.getContentView().setFocusableInTouchMode(true); 
popupMenu.getContentView().setOnKeyListener(new View.OnKeyListener() {   
    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_MENU && 
       event.getRepeatCount() == 0 && 
       event.getAction() == KeyEvent.ACTION_DOWN) { 
      // ... payload action here. e.g. popupMenu.dismiss(); 
      return true; 
     }     
     return false; 
    } 
}); 
0

попробовать это

if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // Do Stuff 
    }