2012-05-10 8 views
6

Un cambio en la configuración del dispositivo Android (por ejemplo, "volver a colocar el teclado rígido") siempre llamará al PhoneWindow.onConfigurationChanged(), que a su vez llamará al reopenMenu(). Esto hará que se vuelva a abrir el menú de la actividad en ejecución actualmente, en caso de que se muestre.¿Cómo compruebo programáticamente si el menú de mi actividad se muestra en un momento determinado?

Tengo un bloqueo en mi menú implementado en mi anulación onPrepareOptionsMenu(). El usuario debe ingresar un código cada vez que quiera ver el menú. No quiero que se le pida al usuario que ingrese el código nuevamente, mientras que el menú todavía está activo solo por un cambio de configuración. Por lo tanto, me gustaría saber si hay alguna manera de verificar si el menú de actividad de primer plano actual ya se muestra. Sabiendo esto, podría omitir pedir el código de acceso si el menú ya está activo.

Mi aplicación personalizada solución es utilizar mi propia bandera menuShowing que yo pongo en onPrepareOptionsMenu y restablecer en onOptionsItemSelected y en onKeyDown si se hace clic en el botón de retroceso.

EDIT: Parece que un cambio en la configuración de orientación de la pantalla no desencadena este comportamiento. Sin embargo, una diapositiva de teclado duro sí lo hace.

+1

Después de mis diversos esfuerzos, creo que su enfoque booleano personalizado es mejor. Es posible que pueda simplificarlo con 'onPrepareOptionsMenu()': true y 'onOptionsMenuClosed()': false (ya que se llamará seleccionando un elemento o presionando una tecla: atrás, inicio, menú). FYI, puede admitir un tipo de diapositiva de teclado rígido en el emulador configurando las propiedades de hardware para que no tenga un teclado rígido en el retrato y tener uno en el paisaje, en caso de que sea útil. – Sam

Respuesta

2

Hasta que alguien viene con la respuesta de un bonito 'una llamada', aquí es la aplicación solución personalizada que menciono en la cuestión, con la ayuda de consejos de Sam, en caso de que alguien necesita la misma funcionalidad:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    if (showingMenu) { 
     // The menu button was clicked or the hard keyboard was 
     // slid open/closed while the menu was already showing 
     return true; 
    } 
    // Otherwise, either the menu was clicked or openOptionsMenu() was called 
    if (codeEntered) { 
     // Code was entered and then openOptionsMenu() was called 
     showingMenu = true; 
     // Menu will now be shown 
     return true; 
    } else { 
     // The menu button was clicked, ask for code 
     askForCode(); 
     // Don't show menu yet 
     return false; 
    } 
}  

@Override 
public void onOptionsMenuClosed(Menu menu) { 
    showingMenu = false; 
    codeEntered = false; 
} 

private void askForCode() { 
    codeEntered = getUserInput(); 
    if (codeEntered) 
     openOptionsMenu(); 
} 

getUserInput() en realidad se produce con la ayuda de un AlertDialog y un EditText con un TextWatcher adjunto, pero los detalles de implementación exceden el alcance de esta pregunta, a menos que alguien esté interesado.

0

En mi caso se inunda

@Override 
    public void onPanelClosed(int featureId, Menu menu) { 
    showingMenu = false; 
    super.onPanelClosed(featureId, menu); 
} 
Cuestiones relacionadas