web-dev-qa-db-fra.com

Menu dans les fragments ne montrant pas

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" />
40
El Duderino

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

}
87
Amir Alagic

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);
}
52
Abhinaw Sharma

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.

7
aglour

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

6
cubo1123

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);
}
5
Cockpit Aliens

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.

5
Orgazm pionerki

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:

Menu contextuel d'un ListFragment

3
jsmith

Votre activité doit être étendue ActionBarActivity . Vous pouvez en avoir un qui ne fait que prolonger Activité. texte fort

0
ockley

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.

0
Dimanoid

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 

0
ekenne chilex