Wie auch immer, die Dokumentation deckt alle Dinge ab.
Ändern von Menüelementen zur Laufzeit
Sobald die Aktivität erstellt wurde, wird die
onCreateOptionsMenu()
Methode wie oben beschrieben nur einmal aufgerufen. Das System behält Menu
die in dieser Methode definierten Daten bei und verwendet sie wieder , bis Ihre Aktivität zerstört ist. Wenn Sie das Optionsmenü jederzeit nach seiner ersten Erstellung ändern möchten, müssen Sie die onPrepareOptionsMenu()
Methode überschreiben . Dadurch erhalten Sie das Menüobjekt, wie es derzeit vorhanden ist. Dies ist nützlich, wenn Sie Menüelemente je nach aktuellem Status Ihrer Anwendung entfernen, hinzufügen, deaktivieren oder aktivieren möchten.
Z.B
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
if (isFinalized) {
menu.getItem(1).setEnabled(false);
// You can also use something like:
// menu.findItem(R.id.example_foobar).setEnabled(false);
}
return true;
}
Unter Android 3.0 und höher gilt das Optionsmenü immer als geöffnet, wenn Menüelemente in der Aktionsleiste angezeigt werden. Wenn ein Ereignis auftritt und Sie eine Menüaktualisierung durchführen möchten, müssen Sie anrufen invalidateOptionsMenu()
, um den Systemaufruf anzufordern onPrepareOptionsMenu()
.
setEnable()
ändert sich, was passiert, wenn Sie dieses Menü drücken, ändert aber nicht, wie es aussieht (was ist los, Android-Entwickler?). Es ist also klarer, entweder den Titel zu deaktivieren und zu ändern oder vorzugsweise nur dasMenuItem
Unsichtbare zu machen.false
Kehren Sie zurück , um das Menü vollständig zu deaktivieren.Bei allen Android-Versionen ist dies am einfachsten: Verwenden Sie diese Option, um ein Menüaktionssymbol als deaktiviert anzuzeigen und es auch als deaktiviert zu aktivieren:
quelle
Sie können das Element beim Erstellen des Optionsmenüs als Variable speichern und dann seine Eigenschaften nach Belieben ändern.
quelle
onPrepareOptionsMenu
?Vereinfachen Sie die @ Vikas-Version
quelle
So aktualisieren Sie das aktuelle Menü, um die Elemente zu aktivieren oder zu deaktivieren, wenn eine AsyncTask abgeschlossen ist.
In meinem Anwendungsfall musste ich mein Menü deaktivieren, während meine AsyncTask Daten lud. Nachdem ich alle Daten geladen hatte, musste ich das gesamte Menü erneut aktivieren, damit der Benutzer es verwenden konnte.
Dadurch wurde verhindert, dass Benutzer beim Laden von Daten auf Menüelemente klicken konnten.
Zuerst deklariere ich eine Zustandsvariable. Wenn die Variable 0 ist, wird das Menü angezeigt. Wenn diese Variable 1 ist, wird das Menü ausgeblendet.
Dann suche
onCreateOptionsMenu()
ich in meiner nach dieser Variablen. Wenn es 1 ist, deaktiviere ich alle meine Elemente. Wenn nicht, zeige ich sie einfach alle anNun, wenn meine Aktivität beginnt,
onCreateOptionsMenu()
wird sie nur einmal aufgerufen, und alle meine Gegenstände sind verschwunden, weil ich zu Beginn den Status für sie eingerichtet habe.Dann erstelle ich eine AsyncTask, in der ich diese Statusvariable in meinem auf 0 setze
onPostExecute()
Dieser Schritt ist sehr wichtig!
Wenn du anrufst
invalidateOptionsMenu();
, wird es neu gestartetonCreateOptionsMenu();
Nachdem ich meinen Status auf 0 gesetzt habe, zeichne ich einfach das gesamte Menü neu, aber diesmal mit meiner Variablen auf 0, das heißt, das gesamte Menü wird angezeigt, nachdem der gesamte asynchrone Prozess abgeschlossen ist, und dann kann mein Benutzer das Menü verwenden .
Ergebnisse
quelle
Die beste Lösung, wenn Sie mit der Navigationsschublade arbeiten
quelle
Eine modernere Antwort auf eine alte Frage:
MainActivity.kt
menu_main_activity.xml
menu_item_icon_selector.xml
attrs.xml
styles.xml or themes.xml
quelle
quelle
Was ich getan habe, war einen Verweis auf das Menü unter zu speichern
onCreateOptionsMenu
. Dies ähnelt der Antwort von nir, außer dass ich nicht jedes einzelne Element, sondern das gesamte Menü gespeichert habe.Deklarieren Sie ein Menü
Menu toolbarMenu;
.Dann
onCreateOptionsMenu
speichern Sie im Menü auf Ihre VariableJetzt können Sie jederzeit auf Ihr Menü und alle Elemente zugreifen.
toolbarMenu.getItem(0).setEnabled(false);
quelle
quelle
Wenn sichtbar Menü
Wenn Menü ausblenden
quelle
Im Allgemeinen können die Eigenschaften Ihrer Ansichten zur Laufzeit geändert werden:
und dann...
aber
Wenn Sie die Sichtbarkeit der Optionen im ContextMenu ändern möchten, können Sie beim Drücken Ihrer Taste ein Flag aktivieren und dann im onCreateContextMenu Folgendes tun:
ich hoffe das hilft
quelle
onCreateContextMenu
Methode ändern kann . Ich möchte jedoch außerhalb dieser Methode auf das Kontextmenü zugreifen.onCreateContextMenu
wird nur einmal aufgerufen, aber ich kann viel Zeit auf die Schaltfläche klicken, um den Menüpunkt zu aktivieren / deaktivieren.