233 votes

Comment modifier dynamiquement le texte d'un élément de menu dans Android ?

J'essaie de modifier le titre d'un élément de menu à partir de l'extérieur de l'interface utilisateur. onOptionsItemSelected(MenuItem item) méthode.

Je fais déjà ce qui suit ;

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.toString());
  }
  return true;
}

Cependant, j'aimerais pouvoir modifier le titre d'un élément de menu particulier en dehors de cette méthode.

0 votes

stackoverflow.com/a/32072318/1651286 devrait être la réponse acceptée

385voto

Charles Harley Points 2773

Je suggérerais de garder une référence dans l'activité à l'objet Menu que vous recevez dans onCreateOptionsMenu et l'utiliser pour récupérer l'élément de menu qui nécessite une modification, lorsque vous en avez besoin. Par exemple, vous pourriez faire quelque chose du genre de ce qui suit :

public class YourActivity extends Activity {

  private Menu menu;
  private String inBedMenuTitle = "Set to 'In bed'";
  private String 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);
    }
  }

}

Alternativement, vous pouvez remplacer onPrepareOptionsMenu pour mettre à jour les éléments du menu à chaque fois que celui-ci est affiché.

1 votes

Je m'attends toujours à ce qu'Android ait une solution plus élégante à ce genre de problèmes. Il semble que les réponses les plus simples soient souvent les meilleures - merci.

150voto

mynameistodd Points 61

Comme JxDarkAngel l'a suggéré, vous pouvez appeler cette fonction à partir de n'importe quel endroit de votre système de gestion de l'information. Activité ,

invalidateOptionsMenu();

puis de les remplacer :

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
  MenuItem item = menu.findItem(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;
    }
  return super.onPrepareOptionsMenu(menu);
}

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

0 votes

La meilleure solution. Parce que celle-ci surcharge la méthode Android au lieu de réinventer la roue.

0 votes

Notez simplement que onPrepareOptionsMenu() est appelé assez souvent par le framework Android, par exemple lors de l'affichage d'une activité et à chaque fois que le menu est affiché. Cela peut donc ne pas être très efficace, si votre menu ne change pas très souvent.

1 votes

invalidateOptionsMenu() appellera également onCreateOptionsMenu() Vous pouvez donc placer la logique de mise à jour dans onCreateOptionsMenu() .

12voto

Pranav Raut Points 341

Vous pouvez créer un objet "Menu" global, puis l'assigner dans onCreateOptionMenu.

public class ExampleActivity extends AppCompatActivity
    Menu menu;

puis affecter ici

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

Puis, plus tard, utilisez l'objet Menu assigné pour obtenir les éléments requis.

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

0 votes

C'est la première solution à laquelle j'ai pensé et elle a fonctionné, merci.

5voto

Jack Points 5682

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

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

...

public void setOptionsTitle(String status)
{
    bedStatus = status;

}

Maintenant, lorsque le menu est rempli, changez le titre en fonction de votre statut :

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(bedStatus);

        // Return true so that the menu gets displayed.
        return true;
    }

0 votes

Je dois pouvoir le définir après le rendu de l'activité. Donc, pas dans ces deux méthodes

0 votes

Appelez setOptionsTitle à tout moment après le rendu de votre activité. Je suppose que je ne comprends pas ce que vous voulez, car "je dois pouvoir le définir après le rendu de l'activité" signifie pour moi qu'après avoir appelé setContent(R.layout.id), vous pourriez avoir besoin de modifier ce que le menu des options affiche (ce que vous pouvez faire avec setOptionsTitle() - à partir de n'importe quelle méthode, n'importe où, n'importe quand).

0 votes

Bien que cette approche fonctionne, elle n'est pas recommandée car l'objet Menu qui gère le menu ne sait pas quand le titre a changé et ne peut donc pas effectuer les tâches dont il peut avoir besoin lorsque le titre change, par exemple la mise en page et les sauts de ligne.

3voto

Oumar Points 31

J'utilise ce code pour mettre en valeur mon élément de navigation inférieur.

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

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