it-swarm.com.de

Wie aktualisiere ich ein in der ActionBar angezeigtes Menüelement?

Ich habe eine Aktivität mit 2 Fragmenten. Beide sind ListFragments und tragen MenuItems zum Menü bei. Ich habe ein MenuItem, für das ich das Attribut Android festgelegt habe: showAsAction, damit es als Schaltfläche in der ActionBar angezeigt wird. Welches funktioniert gut.

Jetzt ist das MenuItem zustandsabhängig. Dies ist eine Menüoption zum Anhalten und Fortsetzen einer Warteschlange. Mein Problem ist, dass ich nicht herausfinden kann, wie die ursprüngliche Statue beim Erstellen des Fragments festgelegt wird.

Ihr Status hängt davon ab, ob die Warteschlange angehalten ist oder nicht. Ich habe also eine AsyncTask, die die Warteschlange abruft und einen booleschen Wert (pausiert) basierend auf dem Status der Warteschlange festlegt. Ich rufe onPrepareOptionsMenu auf, um den Text für das Menüelement Pause basierend auf dem letzten bekannten Status der Warteschlange festzulegen. Dies funktioniert hervorragend, wenn ich das Menüelement 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) lege, wie kann ich die Aktualisierung erzwingen, ohne onPrepareOptionsMenu aufrufen zu müssen? Ich muss in der Lage sein, dies zu tun, da ich beim ersten Start der App eine Anforderung zum Abrufen der Warteschlange sende, die Aufgabe jedoch nach dem Einrichten und Anzeigen der ActionBar wieder ausgeführt wird. Ich habe in meinem Fragment einen Handler erstellt, der jedes Mal aufgerufen wird, wenn ich eine Warteschlangenaktualisierung erhalte. Wie kann ich von dort aus den Text für mein MenuItem in der ActionBar aktualisieren? Es scheint nicht möglich zu sein, das aktuell eingestellte Menü zu manipulieren, außer in onPrepareOptionMenu.

Rob W.

91
brockoli

Option 1: Versuchen Sie invalidateOptionsMenu() . Ich weiß nicht, ob dadurch die Aktionsleiste sofort neu gezeichnet wird oder nicht.

Option 2: Überprüfen Sie, ob getActionView() etwas für das betroffene MenuItem zurückgibt. Es ist möglich, dass showAsAction einfach automatisch Aktionsansichten für Sie erstellt. Wenn ja, können Sie dieses View vermutlich aktivieren/deaktivieren.

Es scheint nicht möglich zu sein, das aktuell eingestellte Menü zu manipulieren, außer in onPrepareOptionMenu.

Sie können sich an das Menu Objekt halten, das Sie in onCreateOptionsMenu() übergeben haben. Zitieren der docs :

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

170
CommonsWare

in meinem Fall: invalidateOptionsMenu hat den Text nur auf den ursprünglichen zurückgesetzt, aber der direkte Zugriff auf den Menüpunkt und das erneute Schreiben des gewünschten Textes funktionierten 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 Kommentars unten 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;
}
12
cV2

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

getActivity().invalidateOptionsMenu();
8
CoolMind

Ich habe diesen Code benutzt:

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 arbeitete wie ein Zauber für mich finden Sie OnPrepareOptionsMenu hier

4
ASK

Befolgen Sie zunächst die beiden Codezeilen, um die Aktionsleistenelemente zu aktualisieren, bevor Sie in oncreateOptionMenu () eine Bedingung festlegen. Beispielsweise:

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();
    }
}
2
saranya

Aus Gründen der Klarheit dachte ich, dass ein direktes Beispiel für das Greifen auf eine Ressource aus dem Folgenden gezeigt werden kann, das meiner Meinung nach zur Beantwortung dieser Frage mit einem schnellen direkten Beispiel 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 eine MenuItem-Referenz am Anfang fest und ändern ihren Status (z. B. bei Änderungen des Symbolstatus) zu einem späteren Zeitpunkt.

1
Jay Snayder