Wie kann ich ein MenuItem im Optionsmenü auf Android ändern?

Lesezeit: 5 Minuten

Benutzer-Avatar
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:

public class MyActivity extends Activity {
    private boolean isStarted = false;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        menu.removeItem(R.id.stop);
        inflater.inflate(R.menu.mymenu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.start:
            isStarted = true;
            return true;
        case R.id.stop:
            isStarted = false;
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        if(isStarted) {
            menu.removeItem(R.id.start);
            menu.add(R.id.stop);
        } else {
            menu.removeItem(R.id.stop);
            menu.add(R.id.start);
        }
        return true;
    }
}

  • 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

Benutzer-Avatar
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:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    menu.findItem(R.id.start).setVisible(!isStarted);
    menu.findItem(R.id.stop).setVisible(isStarted);
    return true;
}

  • Ich habe gerade gesehen, dass ich vergessen habe, die Superklasse wie zuvor vorgeschlagen und in der angegeben aufzurufen Dokumente und die Quelle

    – Fliegenring

    17. März 2011 um 0:45 Uhr

  • Und nur um zu aktualisieren, die Quelle ist unter zu finden grepcode.com/file/repository.grepcode.com/java/ext/…

    – Fliegenring

    9. April 2013 um 11:01 Uhr

Benutzer-Avatar
i.shadrin

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.

Benutzer-Avatar
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.

private boolean isStarted = false;

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case 1:
        isStarted = true;
        return true;
    case 0:
        isStarted = false;
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    if(isStarted) {
        menu.removeItem(1);
        menu.add(0, 0, 0, "Stop");
    } else {
        menu.removeItem(0);
        menu.add(0, 1, 0, "Start");
    }

    return super.onPrepareOptionsMenu(menu);
}

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

Benutzer-Avatar
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

1029360cookie-checkWie kann ich ein MenuItem im Optionsmenü auf Android ändern?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy