J'ai eu de bonnes indications pour mes dernières questions, j'espère que ce ne sera pas différent cette fois-ci :) Laissez-moi d'abord expliquer la situation. J'ai une activité avec 2 fragments. Pour chaque fragment, j’ai une disposition de menu xml, la première a quatre entrées de menu, la seconde n’en a qu’une. Maintenant tout d’abord le fragment avec les quatre entrées de menu est chargé . Dans sa méthode onCreate, je mets
this.setHasOptionsMenu(true);
la méthode onCreateOptionsMenu
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_fragshow, menu);
}
Le fichier XML ressemble à ceci:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@+id/menu_refresh"
Android:icon="@drawable/ic_action_search"
Android:title="Refresh"
Android:visible="true"
Android:showAsAction="ifRoom|withText" />
<item Android:id="@+id/menu_clearall"
Android:icon="@drawable/ic_action_search"
Android:title="Clear"
Android:visible="true"
Android:showAsAction="ifRoom|withText" />
<item Android:id="@+id/menu_addcontent"
Android:icon="@drawable/ic_action_search"
Android:title="Add Content"
Android:visible="true"
Android:showAsAction="ifRoom|withText" />
<item Android:id="@+id/menu_newlist"
Android:icon="@drawable/ic_action_search"
Android:title="New List"
Android:visible="true"
Android:showAsAction="ifRoom|withText" />
</menu>
Cela fonctionne bien. Tous les éléments de menu sont là, je peux cliquer dessus et y répondre. Maintenant, lorsque je clique sur le menu "Ajouter du contenu", l'autre fragment est chargé. Là j'ai aussi bien mis
this.setHasOptionsMenu(true);
la méthode onCreateOptionsMenu
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
Log.i("FragCreateList","onCreateOptionsMenu called");
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_fragcreatelist, menu);
}
Le fichier xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@+id/menu_editdone"
Android:icon="@drawable/ic_action_search"
Android:title="Edit Done"
Android:visible="true"
Android:showAsAction="ifRoom|withText" />
</menu>
Mais dans le nouveau fragment, je ne vois aucun élément de menu. Ni dans la barre d'action, ni lorsque j'appuie sur le bouton de menu du matériel. Dans l'ancien fragment, deux éléments de menu se trouvaient dans la barre d'action, les deux restants apparaissant lorsque le bouton matériel a été enfoncé. Mais ici rien n'est montré. Je reçois le message logcat que la méthode onCreateOptionsMenu a été appelée, mais rien ne se passe. (Je reçois même un appel à ma méthode (vide) onPrepareOptionsMenu, qui devrait être appelée juste avant que le menu ne soit affiché, toujours rien) Avez-vous la moindre idée de ce qui pourrait mal se passer? Appeler invalidateOptionsMenu ne fait rien. En outre, je ne sais pas avec certitude lequel appeler, car il existe un getActivity (). InvalidateOptionsMenu et un getFragmentManager (). InvalidateOptionsMenu ... Merci d'avance.
Modifier :
<uses-sdk
Android:minSdkVersion="14"
Android:targetSdkVersion="15" />
J'ai ajouté setHasOptionsMenu (true) dans onCreateView et cela fonctionne bien
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
return inflater.inflate(R.layout.my_example_fragment, container, false);
}
Utilisez menu.clear () avant de gonfler les menus.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.mnulayout, menu);
}
J'ai eu le même problème. Je l'ai corrigé en utilisant showAsAction dans l'élément appliqué au contexte myApp :
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:myapp="http://schemas.Android.com/apk/res-auto">
<item Android:id="@+id/action_refresh"
Android:icon="@drawable/ic_refresh"
Android:title="refresh"
Android:visible="true"
myapp:showAsAction="ifRoom|withText"/>
</menu>
Désolé, il est trop tard pour vous, mais cela peut être utile pour d’autres personnes.
tout d'abord votre fragment doit avoir dans la onCreate
setHasOptionsMenu(true);
et ensuite vous devez vérifier que votre activité N'A PAS le thème NoActionBar C'est un peu délicat, mais si votre activité a ce thème, peu importe où vous appelez le setHasOptionsMenu(true)
votre fragment ne sera pas peint
Cela fonctionne réellement pour moi et pourrait également être votre solution.
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
Cela est dû au fait que votre appareil possède un bouton de menu matériel. Par conséquent, la valeur de la variable "sHasPermanentMenuKey" est vraie dans ViewConfiguration hasPermanentMenuKey () . Vous devez mettre la valeur de cette variable à faux en utilisant la réflexion. Exemple:
// this method force showing menu button in device with hardware menu button
private void showOverflowMenu(FragmentActivity activity) {
try {
ViewConfiguration config = ViewConfiguration.get(activity);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
NOTE: utilisez cette méthode dans onCreate () d'activité non dans la méthode onCreate () de fragment.
Lorsque vous vous inscrivez pour des options/menus contextuels dans des fragments, vous devez généralement attendre l'appel de onActivityCreated () pour vous assurer qu'il existe une activité à laquelle lier le menu. Essayez le correctif suggéré ici et voyez si cela aide:
Votre activité doit être étendue ActionBarActivity . Vous pouvez en avoir un qui ne fait que prolonger Activité. texte fort
Essayez de changer onCreateOptionsMenu en onPrepareOptionsMenu en fragments, j'ai eu le même problème et autant que je me souvienne, cela l'a résolu pour moi.
Pour une classe de fragments afin de voir votre menu, ajoutez Sethasoptionsmenu (true) dans la méthode onCreateView () ou onCreateAcivity () Mais j'ai ajouté le mien à la méthode onCreateView (). J'espère que ça aide quelqu'un