Wie aktualisiere ich einen in der ActionBar angezeigten Menüpunkt?

Lesezeit: 6 Minuten

Benutzer-Avatar
brockoli

Ich habe eine Aktivität mit 2 Fragmenten. Beide sind ListFragments und beide tragen MenuItems zum Menü bei. Ich habe ein MenuItem, dem ich das Attribut android:showAsAction gesetzt habe, damit es als Schaltfläche auf der ActionBar angezeigt wird. Was gut funktioniert.

Jetzt ist das MenuItem zustandsabhängig. Es ist eine Menüoption Pause/Fortsetzen zum Anhalten und Fortsetzen einer Warteschlange. Mein Problem ist, dass ich nicht herausfinden kann, wie ich die anfängliche Statue festlegen soll, wenn das Fragment erstellt wird.

Ihr Status hängt davon ab, ob die Warteschlange angehalten ist oder nicht. Ich habe also eine AsyncTask, die die Warteschlange abruft und basierend auf dem Status der Warteschlange einen booleschen Wert (angehalten) festlegt. Ich rufe onPrepareOptionsMenu auf, um den Text für das Pause-Menüelement basierend auf dem letzten bekannten Status der Warteschlange festzulegen, und dies funktioniert hervorragend, wenn ich das MenuItem im aktuellen Menü belasse. Sie tippen auf das Menüsymbol und onPrepareOptionsMenu wird ausgelöst und das Menü wird aktualisiert, bevor es angezeigt wird.

Das Problem ist, wenn ich dasselbe MenuItem in die ActionBar (showAsAction) setze, wie kann ich es erzwingen, dass es aktualisiert wird, ohne onPrepareOptionsMenu aufrufen zu müssen? Ich muss dazu in der Lage sein, weil ich beim ersten Start der App eine Anfrage zum Abrufen der Warteschlange sende, aber die Aufgabe zurückkehrt, nachdem die ActionBar eingerichtet und angezeigt wurde. Ich habe in meinem Fragment einen Handler erstellt, der jedes Mal aufgerufen wird, wenn ich eine Warteschlangenaktualisierung erhalte, aber wie kann ich von dort aus den Text für mein MenuItem in der ActionBar aktualisieren? Ich kann anscheinend keinen Weg finden, das aktuell eingestellte Menü zu manipulieren, außer in onPrepareOptionMenu.

Rob W.

Benutzer-Avatar
CommonsWare

Option 1: Versuchen Sie es invalidateOptionsMenu(). Ich weiß nicht, ob dies ein sofortiges Neuzeichnen der Aktionsleiste erzwingt oder nicht.

Option 2: Sehen Sie, ob getActionView() bringt nichts für die Betroffenen zurück MenuItem. Es ist möglich, dass showAsAction erstellt einfach automatisch Aktionsansichten für Sie. Wenn ja, können Sie das vermutlich aktivieren/deaktivieren View.

Ich kann anscheinend keinen Weg finden, das aktuell eingestellte Menü zu manipulieren, außer in onPrepareOptionMenu.

Sie können sich daran festhalten Menu Objekt, das Sie abgegeben haben onCreateOptionsMenu(). Zitieren der Dokumente:

Sie können das Menü (und alle daraus erstellten Elemente) bedenkenlos beibehalten und nach Wunsch Änderungen daran vornehmen, bis das nächste Mal onCreateOptionsMenu() aufgerufen wird.

  • Versuchte Option # 1 und das hat den Trick gemacht. Da ich versuchte, die Benutzeroberfläche in einem Rückruf von einem separaten Thread zu aktualisieren, wurde eine Ausnahme ausgelöst, da ich nicht wirklich im UI-Thread war. Um dies zu beheben, habe ich einen Handler erstellt und eine Aktualisierungsnachricht an den Handler gesendet, als mein Rückruf aufgerufen wurde. Aber letztendlich habe ich getActivity().invalidateOptionsMenu() verwendet, um das Menü zu aktualisieren.

    – Brockoli

    24. April 2011 um 14:06 Uhr


  • @brockoli: Ah, gut! Angesichts der Formulierung der Javadocs für diese Methode war ich skeptisch, ob sie den gewünschten Effekt haben würde, obwohl es den Anschein hat, als wäre dies der Grund gewesen, warum sie sie überhaupt zu API Level 11 hinzugefügt haben. Freut mich zu hören, dass es bei dir funktioniert!

    – CommonsWare

    24. April 2011 um 14:10 Uhr

  • Ich habe meinen Kopf gegen die Wand geschlagen, um das herauszufinden, und es funktioniert wie ein Zauber!

    – Hackmann

    29. September 2012 um 14:19 Uhr

  • Wenn Sie die Support-Bibliothek verwenden, verwenden Sie supportInvalidateOptionsMenu() stattdessen

    – Tim Kist

    13. Oktober 2015 um 12:28 Uhr

  • @TimKist, supportInvalidateOptionsMenu() ist jetzt veraltet; Sie können sicher verwenden invalidateOptionsMenu().

    – c0dehunter

    7. Juni 2018 um 10:09 Uhr

Benutzer-Avatar
cV2

in meinem Fall: invalidateOptionsMenu habe den Text einfach wieder auf den ursprünglichen gesetzt, aber der direkte Aufruf des Menüpunktes und das erneute Schreiben des Wunschtextes funktionierte ohne Probleme:

if (mnuTopMenuActionBar_ != null) {
    MenuItem mnuPageIndex = mnuTopMenuActionBar_
        .findItem(R.id.menu_magazin_pageOfPage_text);

    if (mnuPageIndex != null) {
        if (getScreenOrientation() == 1) {
            mnuPageIndex.setTitle((i + 1) + " von " + pages);
        }
        else {
            mnuPageIndex.setTitle(
                (i + 1) + " + " + (i + 2) + " " + " von " + pages);
        }
        // invalidateOptionsMenu();
    }
}

Aufgrund des folgenden Kommentars konnte ich über den folgenden Code auf den Menüpunkt zugreifen:

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

  • Wie hast du ein Handle auf die ActionBar-Ansicht bekommen? mnuTopMenuActionBar_?

    – Unmöglich

    2. Januar 2012 um 23:33 Uhr

  • Wenn die Aktionsleiste initialisiert wird, habe ich die Ansicht in einer Mitgliedsvariablen gespeichert … wie folgt: @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate (R.menu.magazine_swipe_activity, menu); mnuTopMenuActionBar_ = Menü; gib true zurück; }

    – CV2

    4. Januar 2012 um 9:06 Uhr

  • Dadurch kann es zu Synchronisationsproblemen kommen, oder? Ich meine. Sie wissen nicht genau, wann onCreateOptionMenu ausgeführt wird, daher können Sie Ihr Codestück mit erreichen mnuTopMenuActionBar_ nicht initialisiert, oder? Wie würden Sie das umgehen?

    – acrespo

    15. Oktober 2013 um 20:42 Uhr

  • hey, wenn die Aktionsleiste verwendet wird (ja, hier ist sie), wird diese Methode immer aufgerufen, also gibt es kein Problem damit … (direkt beim Aktivitätsstart) stackoverflow.com/questions/7705927/…

    – CV2

    15. Oktober 2013 um 22:05 Uhr


Um das Menü von Fragment zu aktualisieren, rufen Sie einfach an:

getActivity().invalidateOptionsMenu();

Benutzer-Avatar
FRAGEN

Ich habe diesen Code verwendet:

public boolean onPrepareOptionsMenu (Menu menu) {       
    MenuInflater inflater = getMenuInflater();
    TextView title  = (TextView) findViewById(R.id.title);
    menu.getItem(0).setTitle(
        getString(R.string.payFor) + " " + title.getText().toString());
    menu.getItem(1).setTitle(getString(R.string.payFor) + "...");
    return true;        
}

Und funktionierte wie ein Zauber für mich finden Sie OnPrepareOptionsMenu hier

Benutzer-Avatar
saranya

Bitte folgen Sie zuerst den beiden Codezeilen, um die Elemente der Aktionsleiste zu aktualisieren, bevor Sie eine Bedingung in oncreateOptionMenu() setzen sollten. Zum Beispiel:

Boolean mISQuizItemSelected = false;

/**
 * Called to inflate the action bar menus
 *
 * @param menu
 *      the menu
 *
 * @return true, if successful
 */

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu items for use in the action bar

    inflater.inflate(R.menu.menu_demo, menu);

    //condition to hide the menus
    if (mISQuizItemSelected) {
        for (int i = 0; i < menu.size(); i++) {
            menu.getItem(i).setVisible(false);
        }
    }

    return super.onCreateOptionsMenu(menu);
}

/**
 * Called when the item on the action bar being selected.
 *
 * @param item
 *      menuitem being selected
 *
 * @return true if the menuitem id being selected is matched
 * false if none of the menuitems id are matched
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getId() == R.id.action_quiz) {
        //to navigate based on the usertype either learner or leo
        mISQuizItemSelected = true;

        ActionBar actionBar = getActionBar();
        invalidateOptionMenu();
    }
}

Benutzer-Avatar
Jay Snayder

Zur Verdeutlichung dachte ich, dass ein direktes Beispiel für das Ergreifen einer Ressource im Folgenden gezeigt werden kann, das meiner Meinung nach mit einem schnellen direkten Beispiel zur Antwort auf diese Frage beiträgt.

private MenuItem menuItem_;

@Override
public boolean onCreateOptionsMenu(Menu menuF) 
{
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_layout, menuF);
    menuItem_ = menuF.findItem(R.id.menu_item_identifier);
    return true;
}

In diesem Fall halten Sie zu Beginn an einer MenuItem-Referenz fest und ändern dann zu einem späteren Zeitpunkt deren Zustand (z. B. für Statusänderungen von Symbolen).

1311340cookie-checkWie aktualisiere ich einen in der ActionBar angezeigten Menüpunkt?

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

Privacy policy