Android: Ändern von Optionsmenüelementen programmgesteuert

Lesezeit: 5 Minuten

Benutzer-Avatar
Farhan

Ist es möglich, die Optionsmenüpunkte programmgesteuert zu ändern? Kann mir bitte jemand ein Beispiel geben?

Außerdem möchte ich bestimmte Elemente deaktivieren, damit sie nicht auf die Klicks hören, ist das möglich?

Für alle, die die Optionen des Menüs dynamisch ändern müssen:

private Menu menu;

// ...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    this.menu = menu;
    getMenuInflater().inflate(R.menu.options, menu);
    return true;
}

// ...

private void hideOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(false);
}

private void showOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(true);
}

private void setOptionTitle(int id, String title)
{
    MenuItem item = menu.findItem(id);
    item.setTitle(title);
}

private void setOptionIcon(int id, int iconRes)
{
    MenuItem item = menu.findItem(id);
    item.setIcon(iconRes);
}

  • Eine Einschränkung ist, dass Sie dies sicherstellen müssen menu eingestellt wurde, bevor versucht wurde, a zu erhalten MenuItem heraus. Wenn Sie zum Beispiel so etwas haben actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)die Tabs werden vor dem Menü geladen, also aufgerufen hideOption/showOption innerhalb onTabSelected führt zu einer Nullzeigerausnahme.

    – Salzige Nüsse

    26. März 2013 um 17:02 Uhr

  • Wenn ich benutze item.setVisible(false);, wird das Element nur ausgeblendet, wenn ich auf das Menü selbst klicke. Wenn ich benutze invalidateOptionsMenu(); Das Element reagiert nicht auf das Klicken. Ich würde mich freuen, wenn Sie mir bei einem ähnlichen Problem helfen könnten, mit dem ich konfrontiert bin. stackoverflow.com/questions/54756799/…

    – Aliton Oliveira

    18. Februar 2019 um 23:51 Uhr

  • @AlitonOliveira Sie sollten Ihren item.setVisibility(false)-Teil in die onCreateOptionsMenu-Methode einfügen, indem Sie den Status Ihrer Flag-Variablen überprüfen, und Sie sollten den Bool-Wert Ihres Flags und invalidateOptionsMenu ändern. es wird klappen.

    – Kidus Tekeste

    10. November 2019 um 10:24 Uhr

  • Die Dokumentation von setVisible besagt, dass Sie auch anrufen sollten setEnabled(false) andernfalls kann das Element immer noch über seine Verknüpfung aufgerufen werden

    – Florian Walther

    21. Juni 2020 um 20:44 Uhr


Benutzer-Avatar
Imdad Sarkar

menu.xml

  <item 
    android:id="@+id/item1"
    android:title="your Item">
  </item>

Fügen Sie Ihre Java-Datei ein

  public void onPrepareOptionsMenu(Menu menu) {

    menu.removeItem(R.id.item1);
}

  • Dies ist die, nach der ich gesucht habe, weil ich die Entscheidung einmal zur Laufzeit treffen möchte, aber die Optionen danach nicht ändern muss. Ich habe verwendet: @Override public boolean onPrepareOptionsMenu(Menu menu) { if (!showItemName) { menu.removeItem(R.id.itemname); } true zurückgeben; }

    – nicht mein Stil

    24. September 2017 um 23:44 Uhr

Benutzer-Avatar
corban

Wie Nikolay sagte, tun Sie das in onPrepareOptionsMenu().

Bei Menüpunkten in der Aktionsleiste müssen Sie das Menü mit entwerten
activity.invalidateOptionsMenu();

Dies wird hier ausführlicher beschrieben. Wie kann ich die ActionBar aktualisieren, wenn onPrepareOptionsMenu Menüeinträge gewechselt hat?

Wenn ich den Inhalt meines Optionsmenüs ändern muss, führe ich dies während des onMenuOpened() durch. Dadurch kann ich den Ausführungsstatus genau in dem Moment überprüfen, in dem der Benutzer auf das Menü zugreift.

public boolean onMenuOpened(int featureid, Menu menu)
    {
        menu.clear();
        if (!editable)
        {
            MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign));
            MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify));
            MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete));
            itemAdd.setShortcut('0', 'a');
            itemMod.setShortcut('1', 'm');
            itemDel.setShortcut('2', 'd');
        }
        else
        {
            MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges));
            itemSave.setShortcut('0', 'S');
        }


        return true;
    }

So deaktivieren Sie bestimmte Elemente:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);

  • Als ich einstellte item.setVisible(false);, mein Artikel wird nur ausgeblendet, wenn ich auf das Menü selbst klicke (drei Punkte). Wenn ich benutze invalidateOptionsMenu(); Einige Elemente reagieren nicht auf Klicks. Ich würde mich freuen, wenn Sie mir bei einem ähnlichen Problem helfen könnten, mit dem ich konfrontiert bin. stackoverflow.com/questions/54756799/…

    – Aliton Oliveira

    18. Februar 2019 um 23:42 Uhr

Benutzer-Avatar
S HemaNandhini

Mit den folgenden Zeilen habe ich die Werte im Menü hinzugefügt

getActivity().invalidateOptionsMenu();

versuchen Sie diese Arbeit wie ein Zauber für mich.

  • Als ich einstellte item.setVisible(false);, mein Artikel wird nur ausgeblendet, wenn ich auf das Menü selbst klicke (drei Punkte). Wenn ich benutze invalidateOptionsMenu(); Einige Elemente reagieren nicht auf Klicks. Ich würde mich freuen, wenn Sie mir bei einem ähnlichen Problem helfen könnten, mit dem ich konfrontiert bin. stackoverflow.com/questions/54756799/…

    – Aliton Oliveira

    18. Februar 2019 um 23:42 Uhr

Benutzer-Avatar
Skywalker

Versuchen Sie diesen Code:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    this.menu=menu;
    updateMenuItems(menu);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.document_list_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    if (item.getItemId() == android.R.id.home) {
        onHomeButtonPresssed();
    }else if (item.getItemId() == R.id.action_delete) {
        useCheckBoxAdapter=false;
        deleteDocuments();
    } else if (item.getItemId() == R.id.share) {
        useCheckBoxAdapter=false;
        shareDocuments();
    } else if (item.getItemId() == R.id.action_tick) {
        useCheckBoxAdapter=true;
        onShowCheckboxes();
    }
    updateMenuItems(menu);
    return true;
}

private void updateMenuItems(Menu menu){
    if (useCheckBoxAdapter && menu != null) {
        menu.findItem(R.id.action_delete).setVisible(true);
        menu.findItem(R.id.share).setVisible(true);
        menu.findItem(R.id.action_tick).setVisible(false);
    } else {
        menu.findItem(R.id.action_delete).setVisible(false);
        menu.findItem(R.id.share).setVisible(false);
        menu.findItem(R.id.action_tick).setVisible(true);
    }
    invalidateOptionsMenu();
}

  • Wenn ich benutze invalidateOptionsMenu();, meine immer sichtbaren Elemente funktionieren nicht mehr (ich meine, die Elemente reagieren nicht auf Klicks). Ich würde mich freuen, wenn Sie mir bei einem ähnlichen Problem helfen könnten, mit dem ich konfrontiert bin. stackoverflow.com/questions/54756799/…

    – Aliton Oliveira

    18. Februar 2019 um 23:37 Uhr

1254320cookie-checkAndroid: Ändern von Optionsmenüelementen programmgesteuert

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

Privacy policy