2012-05-10 10 views
6

Eine Android-Gerätekonfiguration ändern (zum Beispiel "schieben Sie die harte Tastatur wieder in") ruft immer PhoneWindow.onConfigurationChanged(), die wiederum reopenMenu() aufrufen wird. Dies führt dazu, dass das Menü der aktuell laufenden Aktivität wieder geöffnet wird, falls es angezeigt wird.Wie programmiere ich programmgesteuert, ob das Menü meiner Aktivität zu einem bestimmten Zeitpunkt angezeigt wird?

Ich habe eine Sperre auf meinem Menü implementiert in meinem onPrepareOptionsMenu() Override. Der Benutzer muss jedes Mal, wenn er das Menü sehen möchte, einen Code eingeben. Ich möchte nicht, dass der Benutzer aufgefordert wird, den Code erneut einzugeben, während das Menü nur wegen einer Konfigurationsänderung noch geöffnet ist. Daher würde ich gerne wissen, ob ich irgendwie überprüfen kann, ob das Menü der aktuellen Vordergrundaktivität bereits angezeigt wird. Wenn ich das weiß, kann ich den Zugangscode umgehen, wenn das Menü bereits geöffnet ist.

Meine individuelle Abhilfe Implementierung ist meine eigene Flagge menuShowing zu verwenden, die ich in onPrepareOptionsMenu gesetzt und zurückgesetzt in onOptionsItemSelected und in onKeyDown wenn die Zurück-Taste angeklickt wird.

EDIT: Es scheint, dass eine Konfigurationsänderung der Bildschirmausrichtung dieses Verhalten nicht auslöst. Eine harte Tastaturfolie tut dies jedoch.

+1

Nach meinen verschiedenen Anstrengungen, ich glaube, Ihr individuelle boolean Ansatz am besten ist. Sie können es vielleicht mit 'onPrepareOptionsMenu()': true und 'onOptionsMenuClosed()': false vereinfachen (da dies entweder durch Auswählen eines Elements oder Drücken einer harten Taste aufgerufen wird: Zurück, Home, Menü). Zu Ihrer Information: Sie können eine Art harte Tastaturfolie im Emulator unterstützen, indem Sie die Hardware-Eigenschaften so einstellen, dass keine harte Tastatur im Hochformat und keine im Querformat vorhanden ist, sollte dies nützlich sein. – Sam

Antwort

2

Bis jemand mit einem schöneren ‚einem Anruf‘ Antwort kommt, ist hier die individuelle Problemumgehung Implementierung, die ich in der Frage erwähnt, mit Hilfe von Sams Tipps, falls jemand muss die gleiche Funktionalität:

@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() tritt tatsächlich mit Hilfe einer AlertDialog und einer EditText mit einem angefügten TextWatcher auf, aber die Implementierungsdetails überschreiten den Umfang dieser Frage, es sei denn jemand interessiert.

0

In meinem Fall es ist

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