web-dev-qa-db-fra.com

Android - Comment modifier de manière dynamique 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 méthode onOptionsItemSelected(MenuItem item).

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.

197
Garbit

Je suggérerais de garder une référence dans l’activité à l’objet Menu que vous recevez dans onCreateOptionsMen , puis de l’utiliser pour récupérer le MenuItem qui nécessite la modification au fur et à mesure des besoins. Par exemple, vous pouvez faire quelque chose dans le sens suivant:

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

}

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

364
Charles Harley

Comme JxDarkAngel l’a suggéré, appelez-le depuis n’importe où dans votre activité ,

invalidateOptionsMenu();

puis en remplaçant:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
  int savedRoute = mPrefs.getInt(getString(R.string.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

103
Todd DeLand

vous pouvez le faire pour créer un objet "Menu" global, puis l'affecter dans onCreateOptionMenu

public class ExampleActivity extends AppCompatActivity
    Menu menu;

puis attribuer ici

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

Utilisez ensuite l'objet Menu assigné pour obtenir les éléments requis.

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

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

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

...

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

}

Maintenant, quand le menu est rempli, changez le titre en quelque soit votre statut:

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

        menu.add(bedStatus);


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

Vous feriez mieux d'utiliser le remplacement onPrepareOptionsMenu

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

Ici n exemple

3
JxDarkAngel

J'utilise ce code pour personnaliser 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");
3
Oumar

Déclarez votre champ de menu.

private Menu menu;

La méthode onCreateOptionsMenu () est la suivante.

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

Vous trouverez ci-dessous votre activité de créateur de noms. 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.

2
hyperCoder

Pour les personnes qui ont besoin du titre défini de manière statique. Cela peut être fait dans le fichier AndroidManifest.xml

<activity
    Android:name=".ActivityName"
    Android:label="Title Text" >
</activity>

Options Menu Title Text

0
moberme

Je devais changer l'icône du menu pour le fragment. J'ai modifié un peu la réponse de Charles à cette question pour le fragment:

    private Menu top_menu;

    //...
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

       setHasOptionsMenu(true);
       //...
       rootview = inflater.inflate(R.layout.first_content,null);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.fragment_menu, menu);
        this.top_menu = menu;
    }


    // my procedure
    private void updateIconMenu() {
         if(top_menu!= null) {
             MenuItem nav_undo = top_menu.findItem(R.id.action_undo);
             nav_undo.setIcon( R.drawable.back);
         }
    }
0
Almaz Vildanov

Il me semble que vous souhaitez modifier le contenu du menu dans une méthode locale. Cette méthode est appelée à tout moment, lorsqu'un événement se produit ou dans le fil de l'interface utilisateur de l'activité.

Pourquoi ne prenez-vous pas l'instance de Menu dans la variable globale dans onPrepareOptionsMenu lorsque celle-ci est remplacée et utilisez-la 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 post-exécution de la tâche asynchrone.

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 code XML du menu et mettre à jour le nom ou l'icône de votre élément.

0
Abhinav Saxena