onCreateOptionsMenu à l'intérieur des fragments


182

J'ai placé à l' setHasOptionsMenu(true)intérieur onCreateView, mais je ne peux toujours pas appeler des onCreateOptionsMenufragments intérieurs.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                         Bundle savedInstanceState) {   
   setHasOptionsMenu(true);             
   return inflater.inflate(R.layout.facesheet, container, false);
}

Ci-dessous mon onCreateOptionsMenucode.

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    getSupportMenuInflater().inflate(R.menu.layout, menu);
    return (super.onCreateOptionsMenu(menu));
}

Le message d'erreur que je reçois:

La méthode onCreateOptionsMenu(Menu)de type Fragment doit remplacer ou implémenter une méthode de supertype.


1
Merci pour le 'setHasOptionsMenu (true);', je cherchais cela.
Fabricio PH

Réponses:


497

essaye ça,

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}

Et en plus, onCreateajoutez cette ligne pour faire apparaître les options dans votreToolbar

setHasOptionsMenu(true);

182
il ne sera pas appelé si vous n'ajoutez pas cette ligne:setHasOptionsMenu(true);
Yoann Hercouet

10
onCreateOptionsMenu () pour les fragments a des arguments différents de ceux des activités.
Jorge

3
et aussi un type de retour différent comme void contrairement à boolean de onCreateOptionsMenu () dans l'activité comme mentionné ci-dessus ans.
Dexter le

4
Remarque intéressante: si vous remplacez également onCreateOptionsMenu dans votre activité contenant, les deux éléments du menu d'options seront affichés.
Adam Johns

5
setHasOptionsMenu(true);doit être appelé onCreate()pour être complet.
Roel

21

Vous avez déjà le fichier généré automatiquement res / menu / menu.xml définissant action_settings .

Dans votre MainActivity.java, utilisez les méthodes suivantes:

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_settings:
            // do stuff, like showing settings fragment
            return true;
    }

    return super.onOptionsItemSelected(item); // important line
}

Dans la onCreateView()méthode de votre appel Fragment:

setHasOptionsMenu(true); 

et ajoutez également ces 2 méthodes:

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_1:
            // do stuff
            return true;

        case R.id.action_2:
            // do more stuff
            return true;
    }

    return false;
}

Enfin, ajoutez le nouveau fichier res / menu / fragment_menu.xml définissant action_1 et action_2 .

De cette façon, lorsque votre application affiche le fragment, son menu contient 3 entrées:

  • action_1 de res / menu / fragment_menu.xml
  • action_2 de res / menu / fragment_menu.xml
  • action_settings de res / menu / menu.xml

1
la question était à l'intérieur de fragments, pas d'activité
OlivierM

2
@OlivierM la réponse explique le menu fragment. J'ai apprécié l'explication de son interaction avec le menu des activités.
Aranda

13

J'ai essayé les réponses @Alexander Farber et @Sino Raj. Les deux réponses sont bien, mais je ne pouvais pas utiliser onCreateOptionsMenu dans mon fragment, jusqu'à ce que je découvre ce qui manquait:

Ajoutez setSupportActionBar (barre d'outils) dans mon activité, comme ceci:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.id.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

J'espère que cette réponse peut être utile pour quelqu'un avec le même problème.


4

Appel

setSupportActionBar(toolbar)

à l'intérieur

onViewCreated(...) 

du fragment

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    ((MainActivity)getActivity()).setSupportActionBar(toolbar);
    setHasOptionsMenu(true);
}

1
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_add_customer, container, false);
        setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.