onCreateOptionsMenu à l'intérieur des fragments

186

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.

Kevin
la source
1
Merci pour le 'setHasOptionsMenu (true);', je cherchais cela.
Rudolf Real

Réponses:

506

essaye ça,

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

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

setHasOptionsMenu(true);
Sino Raj
la source
184
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
5
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
22

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
Alexander Farber
la source
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 le 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.

Filipe Brito
la source
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);
}
Chanh
la source
2
 @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);
}
Keshav Gera
la source
1

Set setHasMenuOptions (true) fonctionne si l'application a un thème avec Actionbar tel que Theme.MaterialComponents.DayNight.DarkActionBarou Activitya sa propre barre d'outils, sinon onCreateOptionsMenuin fragment n'est pas appelé.

Si vous souhaitez utiliser autonome, Toolbarvous devez soit obtenir une activité et définir votre Toolbarbarre d'action comme support avec

(requireActivity() as? MainActivity)?.setSupportActionBar(toolbar)

qui permet à votre fragment onCreateOptionsMenu d'être appelé.

Une autre alternative est, vous pouvez gonfler votre Toolbarpropre menu avec toolbar.inflateMenu(R.menu.YOUR_MENU)un auditeur d'élément avec

toolbar.setOnMenuItemClickListener {
   // do something
   true
}
Thrace
la source