2012-06-26 17 views
5

Tengo una actividad principal que no utiliza el menú de opciones. Necesito implementar este comportamiento: 1. Cuando se presiona el botón Menú de Android, se muestra una ventana emergente 2. Cuando se presiona nuevamente el botón Menú de Android, se cierra la ventana emergente.Interceptar el botón Menú de Android en una ventana emergente

Sé cómo hacer # 1 anulando onKeyDown() en la actividad principal pero no sé cómo hacer # 2. Cuando se muestra la ventana emergente, onKeyDown() de la actividad principal ya no se activa.

¿Cómo capturo el botón Menú de Android cuando la actividad principal tiene una ventana emergente abierta? (en mi caso, la ventana emergente es una ventana emergente con una vista inflada).

Por cierto, he tratado de establecer un detector de teclas en la vista principal de la ventana emergente, pero no se desencadena

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

Si fuera yo, haría el "pop-up" en su propia actividad, de esa manera se puede hacer exactamente de la misma manera que en MainActivity. Simplemente llame a finish() cuando se presiona el menú en la actividad emergente. – FoamyGuy

+0

Gracias. Tengo una gran cantidad de código invertido en la solución emergente (debe aparecer en una ubicación y forma específica en relación con una vista ancla). Si no encuentro la forma de hacerlo funcionar, intentaré enfocarme en la actividad. – user1139880

Respuesta

14

responder a mi propia pregunta. Llamar a setFocusableInTouchMode() en la vista PopupWindow hace el truco y hace que el oyente funcione.

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

probar esto

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