Wie kann ich ein MenuItem im Optionsmenü auf Android ändern?
Lesezeit: 5 Minuten
Jonas
Ich habe ein Optionsmenü auf meinem Activity mit einem MenuItem “Anfang”. Wenn das MenuItem ausgewählt ist, möchte ich das Menü so ändern, dass es Folgendes enthält: MenuItem “Halt”. Und schließlich, wenn “Stop” ausgewählt ist, möchte ich zurück zu “Start” wechseln.
Hier sind Teile meines Codes, die nicht funktionieren. Ich habe sowohl “Start” als auch “Stop” aufgelistet mymenu.xml Ich sollte wahrscheinlich “stop” entfernen, wenn das Menü erstellt wird:
Haben Sie schon versucht, Stop zu entfernen, wenn das Menü erstellt wird? Der Code sieht gut aus. Ich kann nichts erkennen, was andere Probleme verursachen würde.
– Octavian A. Damian
16. November 2010 um 22:40 Uhr
@ Octavian: Ich habe es mit versucht menu.removeItem(R.id.stop); nach getMenuInflater(); aber es hat nicht funktioniert. Ich bekomme entweder zwei Menüpunkte, einen “start” und einen “false” (sollte “stop” sein), oder das Menü stürzt ab, wenn ich angezeigt werden sollte.
– Jonas
16. November 2010 um 22:44 Uhr
wo versuchst du anzurufen removeItem()? Im onPrepareOptionsMenu()?
– Octavian A. Damian
16. November 2010 um 22:46 Uhr
@Octavian: Ich entferne das Element “Stopp” in onCreateOptionsMenu() das erste Mal, dann ändere ich die Elemente ein onPrepareOptionsMenu(). Ich habe dies jetzt zum Code in der Frage hinzugefügt.
– Jonas
16. November 2010 um 22:50 Uhr
Fliegenring
Für diese Art von Vorgang entscheide ich mich normalerweise dafür, die Menüelemente nicht zu ändern, sondern nur diejenigen auszublenden, die Sie nicht benötigen:
Fliegenring Antwort ist richtig, aber menu.findItem() ist laggy und ruft es innerhalb onPrepareOptionsMenu(Menü-Menü) erzeugt eine schlechte Benutzererfahrung. Es ist besser zu bekommen Menüpunkt Objekt einmal beim Erstellen des Menüs, und rufen Sie dann einfach setVisible jedes Mal auf, wenn das Menü auf dem Bildschirm erscheint:
MenuItem mDynamicMenuItem;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
// Get dynamic menu item
mDynamicMenuItem = menu.findItem(R.id.menu_item);
return true;
}
// Prepare the Screen's standard options menu to be displayed. This is called right
// before the menu is shown, every time it is shown. You can use this method to
// efficiently enable/disable items or otherwise dynamically modify the contents.
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
// Here is just a good place to update item
mDynamicMenuItem.setVisible(isVisible);
return true;
}
Diese Methode funktioniert nicht, wenn nur ein Element im Menü vorhanden ist.
– João Carlos
17. Juli 2018 um 14:56 Uhr
Sie müssen wahrscheinlich super.onPrepareOptionsMenu aufrufen, nachdem Sie Ihre Änderungen vorgenommen haben. Von dem Dokumente:
Ableitende Klassen sollten immer die Basisklassenimplementierung aufrufen.
Octavian A. Damian
Ich habe die Lösung. Sie löschen im Grunde die MenuItem beim Anrufen removeItem() damit wird auch die Referenz gelöscht. Die Verwendung dieses Codes funktioniert.
Sie müssen die erstellen MenuItem wieder. Das ist auch der Grund für die false Etikett. Eigentlich braucht man die nicht MenuInflater wie Sie die erstellen Menu über Code, so dass auch keine Menü-XML-Datei erforderlich ist.
Vielen Dank für die Informationen in diesem Beitrag, da sie mein Problem mit den falschen Etiketten in meinem Menü gelöst haben. Ich musste es leicht modifizieren und habe den endgültigen Code, der wie folgt gut funktioniert, in der Hoffnung, dass es jemand anderem etwas Zeit und Frustration erspart. Es ist eine etwas andere Lösung, aber die wichtigste Änderung, die ich vorgenommen habe, war, dass .setVisible entweder auf True oder False gesetzt wurde, abgesehen davon, dass die Lösung von i.shadrins die beste Lösung für meine Anforderungen war.
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if(loggedIn)
{
logIn.setVisible(false);
logOut.setVisible(true);
}
else
{
logIn.setVisible(true);
logOut.setVisible(false);
}
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
logIn = menu.findItem(R.id.loggedOut);
logOut = menu.findItem(R.id.loggedIn);
return true;
}
In welcher Datei soll es abgelegt werden?
– Kein Krieg
8. Januar 2018 um 0:43 Uhr
Dara
Bei Android 3.0 und höher sollten Sie anrufen invalidateOptionsMenu() um anzufordern, dass das System anruft onPrepareOptionsMenu(). Sie können dann das Optionsmenü in der Methode ändern. Sie können die überprüfen Ändern von Menüpunkten zur Laufzeit Abschnitt der Android-Dokumentation hier https://developer.android.com/guide/topics/ui/menus#options-menu für mehr Details.
In welcher Datei soll es abgelegt werden?
– Kein Krieg
8. Januar 2018 um 0:43 Uhr
10293600cookie-checkWie kann ich ein MenuItem im Optionsmenü auf Android ändern?yes
Haben Sie schon versucht, Stop zu entfernen, wenn das Menü erstellt wird? Der Code sieht gut aus. Ich kann nichts erkennen, was andere Probleme verursachen würde.
– Octavian A. Damian
16. November 2010 um 22:40 Uhr
@ Octavian: Ich habe es mit versucht
menu.removeItem(R.id.stop);
nachgetMenuInflater();
aber es hat nicht funktioniert. Ich bekomme entweder zwei Menüpunkte, einen “start” und einen “false” (sollte “stop” sein), oder das Menü stürzt ab, wenn ich angezeigt werden sollte.– Jonas
16. November 2010 um 22:44 Uhr
wo versuchst du anzurufen
removeItem()
? ImonPrepareOptionsMenu()
?– Octavian A. Damian
16. November 2010 um 22:46 Uhr
@Octavian: Ich entferne das Element “Stopp” in
onCreateOptionsMenu()
das erste Mal, dann ändere ich die Elemente einonPrepareOptionsMenu()
. Ich habe dies jetzt zum Code in der Frage hinzugefügt.– Jonas
16. November 2010 um 22:50 Uhr