2012-06-26 3 views
5

Ich habe eine Hauptaktivität, die Optionsmenü nicht verwendet. Ich muss dieses Verhalten implementieren: 1. Wenn die Android Menu-Schaltfläche gedrückt wird, wird ein Popup angezeigt 2. Wenn die Android Menu-Schaltfläche erneut gedrückt wird, wird das Popup-Fenster geschlossen.Abfangen von Android-Menü-Schaltfläche in einem PopupWindow

Ich weiß, wie man # 1 durch Überschreiben onKeyDown() in der Hauptaktivität, aber nicht weiß, wie # 2 zu tun. Wenn das Popup angezeigt wird, wird die onKeyDown() der Hauptaktivität nicht mehr ausgelöst.

Wie kann ich die Schaltfläche Android Menu erfassen, wenn die Hauptaktivität ein geöffnetes Popup hat? (In meinem Fall ist das Popup ein PopupWindow mit einer aufgeblähten Ansicht).

BTW, habe ich versucht, einen Schlüssel Zuhörer auf der Hauptansicht des Popup zu setzen, aber es ist nicht

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

Wenn es nach mir ginge, würde ich das „Pop-up“ in die eigenen Tätigkeit machen, auf diese Weise kann es genau die gleiche Art und Weise wie in der MainActivity erfolgen. Rufen Sie einfach finish() auf, wenn das Menü in der Popup-Aktivität gedrückt wird. – FoamyGuy

+0

Danke. Ich habe viel Code in die Popup-Lösung investiert (sie muss an einer bestimmten Stelle und Form in Bezug auf eine Ankeransicht erscheinen). Wenn ich keinen Weg finden werde, es zum Laufen zu bringen, werde ich versuchen, mich dem Aktivitätsansatz zu nähern. – user1139880

Antwort

14

meine eigene Frage zu beantworten. Das Aufrufen von setFocusableInTouchMode() in der PopupWindow-Ansicht funktioniert und bewirkt, dass der Listener funktioniert.

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

ausgelöst versuchen diese

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