Android – Comment modifier dynamicment le texte d’un élément de menu en dehors de onOptionsItemsSelected ou onCreateOptionsMenu

J’essaie de changer le titre d’un élément de menu en dehors de la onOptionsItemSelected(MenuItem item) .

Je fais déjà les choses suivantes:

 public boolean onOptionsItemSelected(MenuItem item) { try { switch(item.getItemId()) { case R.id.bedSwitch: if(item.getTitle().equals("Set to 'In bed'")) { item.setTitle("Set to 'Out of bed'"); inBed = false; } else { item.setTitle("Set to 'In bed'"); inBed = true; } break; } } catch(Exception e) { Log.i("Sleep Recorder", e.toSsortingng()); } return true; } 

Cependant, je voudrais pouvoir modifier le titre d’un élément de menu particulier en dehors de cette méthode.

Je suggère de conserver une référence dans l’activité à l’object Menu que vous recevez dans onCreateOptionsMenu , puis de l’utiliser pour récupérer le MenuItem qui nécessite la modification au fur et à mesure de vos besoins. Par exemple, vous pouvez faire quelque chose du genre:

 public class YourActivity extends Activity { private Menu menu; private Ssortingng inBedMenuTitle = "Set to 'In bed'"; private Ssortingng outOfBedMenuTitle = "Set to 'Out of bed'"; private boolean inBed = false; @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); // Create your menu... this.menu = menu; return true; } private void updateMenuTitles() { MenuItem bedMenuItem = menu.findItem(R.id.bedSwitch); if (inBed) { bedMenuItem.setTitle(outOfBedMenuTitle); } else { bedMenuItem.setTitle(inBedMenuTitle); } } } 

Vous pouvez également remplacer le menu onPrepareOptionsMenu pour mettre à jour les éléments de menu chaque fois que le menu est affiché.

Comme JxDarkAngel l’a suggéré, appelez cela de n’importe où dans votre activité ,

 invalidateOptionsMenu(); 

puis annulant:

 @Override public boolean onPrepareOptionsMenu(Menu menu) { int savedRoute = mPrefs.getInt(getSsortingng(R.ssortingng.saved_route), 0); if (savedRoute > 0) { menu.findItem(R.id.action_route).setTitle("Route " + savedRoute); } return super.onPrepareOptionsMenu(menu); } 

est un bien meilleur choix. J’ai utilisé la réponse de https://stackoverflow.com/a/17496503/568197

vous pouvez le faire en créant un object “Menu” global, puis l’affecter dans onCreateOptionMenu

 public class ExampleActivity extends AppCompatActivity Menu menu; 

puis atsortingbuez ici

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

Ensuite, utilisez l’object de menu assigné pour obtenir les éléments requirejs

 menu.findItem(R.id.bedSwitch).setTitle("Your Text"); 

Créez une méthode setOptionsTitle () et définissez un champ dans votre classe. Tel que:

 Ssortingng bedStatus = "Set to 'Out of Bed'"; 

 public void setOptionsTitle(Ssortingng status) { bedStatus = status; } 

Maintenant, lorsque le menu est rempli, changez le titre en n’importe quel statut:

 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(bedStatus); // Return true so that the menu gets displayed. return true; } 

Vous feriez mieux d’utiliser le remplacement surPrepareOptionsMenu

 menu.Clear (); if (TabActual == TabSelec.Anuncio) { menu.Add(10, 11, 0, "Crear anuncio"); menu.Add(10, 12, 1, "Modificar anuncio"); menu.Add(10, 13, 2, "Eliminar anuncio"); menu.Add(10, 14, 3, "Actualizar"); } if (TabActual == TabSelec.Fotos) { menu.Add(20, 21, 0, "Subir foto"); menu.Add(20, 22, 1, "Actualizar"); } if (TabActual == TabSelec.Comentarios) { menu.Add(30, 31, 0, "Actualizar"); } 

Voici un exemple

Déclarez votre champ de menu.

 private Menu menu; 

Voici la méthode onCreateOptionsMenu ()

 public boolean onCreateOptionsMenu(Menu menu) { this.menu = menu; try { getMenuInflater().inflate(R.menu.menu_main,menu); } catch (Exception e) { e.printStackTrace(); Log.i(TAG, "onCreateOptionsMenu: error: "+e.getMessage()); } return super.onCreateOptionsMenu(menu); } 

Ce qui suit sera votre activité de définition de nom. Soit par un clic sur un bouton ou par un code conditionnel

 public void setMenuName(){ menu.findItem(R.id.menuItemId).setTitle(/*Set your desired menu title here*/); } 

Cela a fonctionné pour moi.

Il me semble que vous voulez changer le contenu du menu dans une méthode locale, et cette méthode est appelée à tout moment, chaque fois qu’un événement se produit ou dans le thread de l’interface utilisateur de l’activité.

Pourquoi ne prenez-vous pas l’instance de Menu dans la variable globale dans onPrepareOptionsMenu lorsque cela est remplacé et utilisé dans votre méthode. Assurez-vous que cette méthode est appelée chaque fois qu’un événement se produit (comme un clic de bouton), ou dans le thread d’interface utilisateur de l’activité, le gestionnaire ou la tâche asynchrone après son exécution.

Vous devez connaître à l’avance l’index de cet élément de menu que vous souhaitez modifier. Après avoir effacé le menu, vous devez gonfler le menu XML et mettre à jour le nom ou l’icône de votre élément.

Pour les personnes qui ont besoin du jeu de titres de manière statique. Cela peut être fait dans le fichier AndroidManifest.xml

   

Options Menu Titre Texte

J’utilise ce code pour costum mon object de navigation en bas

 BottomNavigationView navigation = this.findViewById(R.id.my_bottom_navigation); Menu menu = navigation.getMenu(); menu.findItem(R.id.nav_wall_see).setTitle("Hello");