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