web-dev-qa-db-fra.com

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

J'ai une barre d'outils ainsi qu'un tiroir de navigation. Lorsque je lance mon application, la barre d'outils et le tiroir de navigation sont créés. Lorsque je clique sur des éléments du tiroir de navigation, de nouveaux fragments sont créés et la même barre d'outils est conservée. Comment puis-je ajouter des éléments de menu à la barre d'outils tels que rechercher, ajouter, modifier lorsque je commence des fragments spécifiques? Je ne les veux pas au début du programme, mais créé de manière dynamique. 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 de la barre d’outils fait une chose spécifique par rapport au bouton d’édition d’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"
/>
59
Joe Eigi
@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);
}
117
Gundu Bandgar

Voici comment créer un menu de manière dynamique: 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);
29
Allen Chan

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 sur une même activité . Faites les choses suivantes dans chaque fragment comme vous le souhaitez:

Dans la méthode OnCreateView, appelez

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 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);
    }
}
14
Prateek Gupta

Remplacez la méthode onCreateOptionsMenu dans chacun de vos fragments.

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

J'ai résolu ce problème correctement. Ma solution est comme 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);
}
4
Hai Rom

J'avais 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 ne montrer 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 va aider.

2
Matteo Gariglio

Vous trouverez ci-dessous les étapes à suivre pour 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’option associés aux fragments.

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)
}
0
takharsh