Barre d'outils Android Ajout d'éléments de menu pour différents fragments

90

J'ai une barre d'outils ainsi qu'un tiroir de navigation. Lorsque je démarre mon application, la barre d'outils et le tiroir de navigation sont créés. Lorsque je clique sur des éléments dans le tiroir de navigation, il démarre de nouveaux fragments et conserve la même barre d'outils. Comment ajouter des éléments de menu à la barre d'outils tels que rechercher, ajouter, modifier lorsque je démarre des fragments spécifiques? Je ne les veux pas au début du programme, mais créés dynamiquement. Aussi, comment pourrais-je cliquer sur ces boutons et les faire démarrer d'autres fragments. Je le veux donc dans un fragment, le bouton d'édition dans la barre d'outils fait une chose spécifique par rapport au bouton d'édition dans un autre fragment. Merci!

Menu_toolbar:

<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item android:id="@+id/edit"
    android:orderInCategory="1"
    android:title="Edit"
    app:showAsAction="always"
    android:icon="@drawable/pencil_icon"/>
<item android:id="@+id/add"
    android:orderInCategory="1"
    android:title="Add"
    app:showAsAction="always"
    android:icon="@drawable/plus_icon"/>

Barre d'outils:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#10a1ff"
android:title="Home"
/>
Joe Eigi
la source

Réponses:

168

Ajoutez un code similaire à vos fragments:

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


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

De cette façon, vous pouvez personnaliser le menu de vos fragments.

Gundu Bandgar
la source
19
C'est la bonne réponse, car l'appel à setHasOptionsMenu (true) est requis pour la méthode onCreateOptionsMenu appelée dans le fragment.
John Slavick
15
Rappelez - vous à appeler menu.clear()à onCreateOptionsMenu- sinon vous héritez le menu du parent, aussi.
Dart Dega
@DartDega où je mets du code à effacer? Fragment ou activité monsieur, je ne vois pas de menuitem dans mon fragment
famfamfam
Cela fonctionne-t-il avec le niveau d'API 28? Je vois toujours les éléments du menu des activités principales
ArdenDev
33

Voici comment créer un menu dynamiquement: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

Édité:

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
actionBarToolBar.setNavigationIcon(R.drawable.icon);
actionBarToolBar.setNavigationContextDescription(getResources().getString(R.string.desc);
actionBarToolBar.setLogo(R.drawable.other_icon);
actionBarToolBar.setLogoDescription(getResources().getString(R.string.other_desc);
actionBarToolBar.inflateMenu(R.menu.fragment_menu);
Allen Chan
la source
4
utiliser actionBarToolbar.setOnMenuItemClickListener()pour gérer les actions des éléments de menu. onOptionsItemSelected()n'est pas appelé dans cette situation.
Lahiru Chandima
2
le lien donné n'est plus
Ashvin solanki
25

La meilleure façon de le faire:

1. Recherchez la barre d'outils dans Activity et définissez-la comme supportActionBar.

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);

2. Ensuite, ce sera un jeu d'enfant de gérer les menus d'options pour différents fragments au cours d'une même activité. Procédez comme vous le souhaitez dans chaque fragment:

Dans l'appel de méthode OnCreateView

setHasOptionsMenu(true);

Et enfin,

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

Et pour gérer les éléments de menu, cliquez sur, nous avons onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search :
            Log.i("item id ", item.getItemId() + "");
        default:
            return super.onOptionsItemSelected(item);
    }
}
Prateek Gupta
la source
1
setHasOptionsMenu (true) est vraiment utile! Thank U
J.Dragon
10

Remplacez la onCreateOptionsMenuméthode dans chaque fragment.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu_xml, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Ellie Zou
la source
@JoeEigi Pourquoi voulez-vous une barre d'outils différente? Vous pouvez définir différents titres et menus.
Ellie Zou
@JoeEigi oui, vous pouvez avoir un menu personnalisé en gonflant le menu personnalisé xml. L'appel setTitle()peut ajouter des titres.
Ellie Zou
@JoeEigi On dirait que vous vous trompez de contexte, jetez un œil à ceci: stackoverflow.com/questions/26998455/…
Allen Chan
1
J'ai désactivé la barre d'actions dans mon manifeste, mais je suis toujours présente dans la disposition de mon activité au-dessus de la barre d'outils. Comment puis-je m'en débarrasser
Joe Eigi
Oui, j'ai fait cela et apparaît toujours dans ma mise en page mais est déplacé hors de vue
Joe Eigi
4

J'ai résolu ce problème correctement. Ma solution est le code suivant:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_order_history, container, false);
    //getActivity().invalidateOptionsMenu();


    setHasOptionsMenu(true);

    return mRootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Hai Rom
la source
Oui, j'ai montré le menu correctement. Mais comment masquer ce menu à la fermeture du fragment, je veux dire quand on passe à un autre fragment par exemple à partir de a -> b, le menu d'un encore visible dans la barre d'outils du fragment b.
Zeeshan Ahmed
utilisez setHasOptionsMenu (false) dans onCreateView du fragment b.
Kannan_SJD
4

J'ai eu le même problème et je voulais remplacer le menu de la barre d'outils en fonction du fragment affiché.

Le problème auquel je suis maintenant confronté est que le menu est ajouté au précédent.

Afin de n'afficher que le menu du fragment, je suggère:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     menu.clear(); //Empty the old menu
     inflater.inflate(R.menu.menu_fragment1, menu);
     super.onCreateOptionsMenu(menu, inflater);
}

J'espère que ça aidera.

Matteo Gariglio
la source
2
il suffit de vérifier si menu! = null avant d'appeler à .clear ()
mapo
2

Vous trouverez ci-dessous les étapes permettant d'afficher différentes options de menu avec différents fragments.

Étape 1: Appelez setHasOptionsMenu (true)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        setHasOptionsMenu(true)
        super.onViewCreated(view, savedInstanceState)

    }

Étape 2: gonflez vos éléments de menu d'options liés au fragment.

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    // To clear previously added menu items
    menu?.clear()
    inflater?.inflate(R.menu.your_fragment_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}
takharsh
la source
Cela m'a aidé à supprimer le bouton de menu indésirable qui apparaissait sur mon nouveau menu
Im Batman
1

À l'intérieur de XML, ajoutez cette ligne

app:menu="@menu/main_menu"
AbdelraZek
la source
1
En fait, vous avez raison! Vous pouvez le spécifier par xml, puis dans le fragment: `` override fun onViewCreated (view: View, savedInstanceState: Bundle?) {Super.onViewCreated (view, savedInstanceState) toolBar.setNavigationOnClickListener {activity? .OnBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView as SearchView searchView.setOnQueryTextListener (this)} `` `
user3193413
0

En utilisant la nouvelle MaterialToolbar, il est très facile de créer un menu à débordement et de l'utiliser pour:

<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>

puis dans le code pour définir les écouteurs OnCLick, ajoutez simplement ceci:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
Amin Keshavarzian
la source