96 votes

Comment mettre à jour un élément de menu affiché dans la barre d'actions?

J'ai une Activité qui a 2 fragments. Les deux sont ListFragments et à la fois contribuer MenuItems au Menu. J'ai un MenuItem que j'ai défini l'attribut android:showAsAction n'en afficher qu'un bouton sur l'ActionBar. Qui fonctionne très bien.

Maintenant, le MenuItem est dépendante de l'état. C'est une Pause/Reprendre l'option de menu pour l'interruption et la reprise d'une file d'attente. Mon problème est que je peux pas comprendre comment le set initial statue lorsque le Fragment est créé.

C'est l'état dépend de la question de savoir si la file d'attente est en pause ou pas. J'ai donc une AsyncTask qui obtient la file d'attente et définit une valeur booléenne (pause) en fonction de l'état de la file d'attente. Je vais appeler onPrepareOptionsMenu de définir le texte pour le menu de Pause sur la base du dernier cours connu de l'état de la file d'attente et cela fonctionne très bien si je laisse la MenuItem dans le menu. Vous appuyez sur l'icône menu et onPrepareOptionsMenu est tiré et que le menu est mis à jour avant leur affichage.

Le problème est que si je mets la même MenuItem sur l'ActionBar (showAsAction), comment puis-je forcer à mettre à jour sans avoir à appeler onPrepareOptionsMenu? J'ai besoin d'être en mesure de le faire parce que lors du premier lancement de l'application, j'ai envoyer une demande pour obtenir la file d'attente, mais la tâche est de retour après l'ActionBar est de l'installation et de l'affiche. J'ai créé un gestionnaire dans mon fragment qui est appelée à chaque fois que je reçois une file d'attente de mise à jour, mais à partir de là, comment puis-je mettre à jour le texte de mon MenuItem sur l'ActionBar? Je n'arrive pas à trouver un moyen d'obtenir la mise à Menu manipuler, sauf pour onPrepareOptionMenu.

Rob W.

176voto

CommonsWare Points 402670

Option #1: Essayez invalidateOptionsMenu(). Je ne sais pas si cela va forcer immédiatement redessiner de la barre d'action ou pas.

Option #2: Voir si getActionView() retourne rien que pour le touché MenuItem. Il est possible qu' showAsAction simplement crée automatiquement l'action pour vous. Si oui, vous pouvez probablement activer/désactiver View.

Je n'arrive pas à trouver un moyen d'obtenir la mise à Menu manipuler, sauf pour onPrepareOptionMenu.

Vous pouvez l'accrocher sur l' Menu les objets qui vous ont été remis en onCreateOptionsMenu(). Citant les docs:

Vous pouvez tenir sur le menu (ainsi que tous les éléments créés à partir), modifier comme vous le souhaitez, jusqu'à la prochaine fois onCreateOptionsMenu() est appelée.

14voto

cV2 Points 2073

dans mon cas : `` juste re-paramétré le texte à l’original, mais directement accéder à l’élément de menu et de ré-écriture du texte de désir fonctionne sans problème :

en raison de la remarque ci-dessous, j’ai pu accéder à l’élément de menu via le code suivant :

4voto

ASK Points 57

J’ai utilisé ce code :

Et a fonctionné comme un charme pour moi, vous pouvez trouver OnPrepareOptionsMenu ici

2voto

saranya Points 5
First please follow the two lines of codes to update the action bar items 
before that you should set a condition in oncreateOptionMenu().
For example:
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();
}
}

1voto

Jay Snayder Points 856

Pour plus de clarté, j’ai pensé qu’un exemple direct de saisir sur une ressource peut figurer parmi les options suivantes qui contribue à la réponse à cette question avec un exemple direct rapide selon moi.

Dans ce cas, vous tenez une référence MenuItem au début et puis modifiez l’état de celui-ci (pour l’icône change d’état par exemple) à un moment donné la plus tard dans le temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X