Comment mettre à jour un élément de menu affiché dans ActionBar?

J’ai une activité qui a 2 fragments. Les deux sont des ListFragments et les deux consortingbuent à MenuItems au Menu. J’ai un MenuItem sur lequel j’ai défini l’atsortingbut android: showAsAction pour l’avoir comme bouton sur la barre d’action. Ce qui fonctionne bien

Maintenant, le MenuItem dépend de l’état. C’est une option de menu Pause / Resume pour mettre en pause et reprendre une queue. Mon problème est que je ne peux pas comprendre comment définir sa statue initiale lorsque le fragment est créé.

Son état dépend du fait que la queue soit en pause ou non. J’ai donc une AsyncTask qui obtient la queue et définit un booléen (en pause) en fonction de l’état de la queue. J’appelle onPrepareOptionsMenu pour définir le texte de l’élément de menu Pause en fonction du dernier état connu de la queue et cela fonctionne bien si je laisse le MenuItem dans le menu réel. Vous appuyez sur l’icône du menu et onPrepareOptionsMenu est déclenché et le menu est mis à jour avant d’être affiché.

Le problème est que, si je mets ce même MenuItem sur ActionBar (showAsAction), comment puis-je le forcer à mettre à jour sans avoir à appeler onPrepareOptionsMenu? Je dois être capable de le faire car lors du premier lancement de l’application, j’envoie une demande pour obtenir la queue, mais la tâche revient après la configuration et l’affichage d’ActionBar. J’ai créé un gestionnaire dans mon fragment qui est appelé chaque fois que je reçois une mise à jour de la queue, mais à partir de là, comment puis-je mettre à jour le texte de mon MenuItem sur ActionBar? Je n’arrive pas à trouver un moyen de le manipuler, sauf dans onPrepareOptionMenu.

Rob W.

Option n ° 1: Essayez invalidateOptionsMenu() . Je ne sais pas si cela va forcer une redessination immédiate de la barre d’action ou non.

Option n ° 2: voir si getActionView() renvoie quelque chose pour le MenuItem affecté. Il est possible que showAsAction crée automatiquement des vues d’action pour vous. Si c’est le cas, vous pouvez probablement activer / désactiver cette View .

Je n’arrive pas à trouver un moyen de le manipuler, sauf dans onPrepareOptionMenu.

Vous pouvez accrocher l’object Menu dans onCreateOptionsMenu() vous avez été remis onCreateOptionsMenu() . Citant les documents :

Vous pouvez conserver le menu (et tous les éléments créés à partir de celui-ci) en toute sécurité, en y apportant les modifications souhaitées, jusqu’à la prochaine utilisation de onCreateOptionsMenu ().

dans mon cas: invalidateOptionsMenu simplement re-réglé le texte à l’original, mais accéder directement à l’élément de menu et réécrire le texte désiré a fonctionné sans problèmes:

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

En raison du commentaire ci-dessous, j’ai pu accéder à l’élément de menu via le code suivant:

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

Pour actualiser le menu à partir de Fragment, appelez simplement:

 getActivity().invalidateOptionsMenu(); 

J’ai utilisé ce code:

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

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

Pour plus de clarté, j’ai pensé qu’un exemple direct de saisie sur une ressource peut être montré à partir des éléments suivants qui, selon moi, consortingbuent à la réponse à cette question avec un exemple direct rapide.

 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; } 

Dans ce cas, vous conservez une référence MenuItem au début, puis vous en modifiez l’état (pour les modifications d’état des icons, par exemple) à un moment donné.

Veuillez d’abord suivre les deux lignes de codes pour mettre à jour les éléments de la barre d’action avant de définir une condition dans oncreateOptionMenu (). Par exemple:

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