web-dev-qa-db-fra.com

onCreateOptionsMenu dans les fragments

J'ai placé setHasOptionsMenu(true) dans onCreateView, mais je ne peux toujours pas appeler onCreateOptionsMenu dans des fragments.

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

Ci-dessous mon code onCreateOptionsMenu.

@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 type supertype.

148
Kevin

essaye ça,

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

Et dans onCreate, ajoutez cette ligne pour que les options apparaissent dans votre Toolbar

setHasOptionsMenu(true);
424
Sino Raj

Vous avez déjà le fichier généré automatiquement res/menu/menu.xml define 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 méthode onCreateView() 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 define action_1 et action_2 .

Ainsi, 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
  • actions_settings from res/menu/menu.xml
19
Alexander Farber

J'ai essayé les réponses @Alexander Farber et @Sino Raj. Les deux réponses sont bien, mais je ne pouvais pas utiliser le menu onCreateOptionsMaint 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 qui a le même problème.

5

Appel 

setSupportActionBar(toolbar)

à l'intérieur

onViewCreated(...) 

de 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);
}
2
Chanh
 @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);
}
0
Keshav Gera