web-dev-qa-db-fra.com

Comment ajouter le menu des options de la barre d’action dans Android Fragments

J'essaie d'avoir un menu d'options dans Android Fragments. Les options du menu ActionBar ne s'affichent pas dans mes fragments.

Voici mon code et j'ai à la fois la fonction onCreateOptionsMenu() et onOptionSelected(). Mon code ne montre aucune erreur. Mais les options ne s'affichent pas.

package org.reachout;

import Android.os.Bundle;
import Android.support.v4.app.Fragment;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.LinearLayout;

import org.general.R;

public class ViewMessageFragment extends Fragment {

    /* (non-Javadoc)
     * @see Android.support.v4.app.Fragment#onCreateView(Android.view.LayoutInflater, Android.view.ViewGroup, Android.os.Bundle)
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (container == null) {
            // We have different layouts, and in one of them this
            // fragment's containing frame doesn't exist.  The fragment
            // may still be created from its saved state, but there is
            // no reason to try to create its view hierarchy because it
            // won't be displayed.  Note this is not needed -- we could
            // just run the code below, where we would create and return
            // the view hierarchy; it would just never be used.
            return null;
        }
        return (LinearLayout)inflater.inflate(R.layout.viewmessages_tab_fragment_layout, container, false);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // TODO Auto-generated method stub
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.askexperts_menu, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
       // handle item selection
       switch (item.getItemId()) {
          case R.id.action_settings:
             // do s.th.
             return true;
          default:
             return super.onOptionsItemSelected(item);
       }
    }   

}
61
Karthik Sekar

Vous devez appeler setHasOptionsMenu(true) dans onCreate().

Pour la compatibilité ascendante, il est préférable de placer cet appel le plus tard possible à la fin de onCreate() ou même ultérieurement dans onActivityCreated() ou quelque chose du genre.

Voir: https://developer.Android.com/reference/Android/app/Fragment.html#setHasOptionsMenu (boolean)

90
flx

Je suis en retard pour la réponse mais je pense que ceci est une autre solution qui n'est pas mentionnée ici donc poster.

Étape 1: Créez un xml de menu que vous souhaitez ajouter, comme je dois ajouter une action de filtrage sur ma barre d’action pour créer un xml filter.xml. La ligne principale à noter est Android: orderInCategory Ceci affichera l’icône d’action en premier ou en dernier, quel que soit l'endroit où vous souhaitez le montrer. Une dernière chose à noter est la valeur. Si la valeur est inférieure à celle indiquée, elle sera affichée en premier et si la valeur est supérieure, elle sera affichée en dernier.

filter.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools" >


    <item
        Android:id="@+id/action_filter"
        Android:title="@string/filter"
        Android:orderInCategory="10"
        Android:icon="@drawable/filter"
        app:showAsAction="ifRoom" />


</menu>

Étape 2: Dans onCreate () la méthode de fragment vient de mettre la ligne ci-dessous, comme mentionné, qui est chargée de rappeler onCreateOptionsMenu (Menu Menu, MenuInflater inflater) méthode comme dans un Activité.

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

Étape 3: Maintenant ajoutez la méthode onCreateOptionsMen qui sera remplacée par:

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.filter, menu);  // Use filter.xml from step 1
    }

Étape 4: Maintenant, ajoutez onOptionsItemSelected méthode permettant d'implémenter la logique de votre choix lorsque vous sélectionnez l'icône d'action ajoutée dans actionBar:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if(id == R.id.action_filter){
            //Do whatever you want to do 
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
80
Pankaj