Barra degli strumenti Android Aggiunta di voci di menu per diversi frammenti


89

Ho una barra degli strumenti e un cassetto di navigazione. Quando avvio la mia app, vengono creati la barra degli strumenti e il cassetto di navigazione. Quando faccio clic sugli elementi nel cassetto di navigazione, avvia nuovi frammenti e mantiene la stessa barra degli strumenti. Come posso fondamentalmente aggiungere voci di menu alla barra degli strumenti come ricerca, aggiunta, modifica quando avvio frammenti specifici? Non li voglio all'inizio del programma, ma creati dinamicamente. Inoltre, come potrei fare clic su questi pulsanti e fare in modo che inizino altri frammenti. Lo voglio così in un frammento, il pulsante di modifica nella barra degli strumenti fa una cosa specifica rispetto al pulsante di modifica in un altro frammento. Grazie!

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"/>

Barra degli strumenti:

<?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"
/>

Risposte:


167

Aggiungi un codice simile ai tuoi frammenti:

@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);
}

In questo modo puoi personalizzare il menu per i tuoi frammenti.


19
Questa è la risposta corretta perché la chiamata a setHasOptionsMenu (true) è richiesta per il metodo onCreateOptionsMenu chiamato nel frammento.
John Slavick

15
Ricordate di chiamare menu.clear()in onCreateOptionsMenu- altrimenti si eredita il menu dal genitore, anche.
Dart Dega

@DartDega dove metto il codice per cancellare? Frammento o attività signore, non vedo menuitem nel mio frammento
famfamfam

Funziona con il livello API 28? Vedo ancora le voci di menu delle attività principali
ArdenDev

33

Ecco come creare dinamicamente il menu: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

Modificato:

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);

4
utilizzare actionBarToolbar.setOnMenuItemClickListener()per gestire le azioni delle voci di menu. onOptionsItemSelected()non viene chiamato in questa situazione.
Lahiru Chandima

2
dato il collegamento non c'è più
Ashvin solanki

25

Il modo migliore per farlo:

1. Trova la barra degli strumenti in Attività e impostala come supportActionBar.

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

2. Quindi sarà un gioco da ragazzi gestire i menu delle opzioni per diversi frammenti in una stessa attività. Fai le seguenti cose in ogni frammento come vuoi:

Nella chiamata al metodo OnCreateView

setHasOptionsMenu(true);

E infine,

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

E per gestire le voci di menu fare clic, abbiamo 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);
    }
}

1
setHasOptionsMenu (true) è davvero utile! Grazie a U
J.Dragon

10

Sostituisci il onCreateOptionsMenumetodo in ogni tuo frammento.

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

@JoeEigi Perché vuoi una barra degli strumenti diversa? È possibile impostare titoli e menu diversi.
Ellie Zou

@ JoeEigi sì, puoi avere un menu personalizzato gonfiando il menu personalizzato xml. La chiamata setTitle()può aggiungere titoli.
Ellie Zou

@JoeEigi Sembra che tu abbia sbagliato contesto, dai un'occhiata a questo: stackoverflow.com/questions/26998455/…
Allen Chan

1
Ho disattivato la barra delle azioni nel mio manifest, ma compare ancora nel mio layout di attività sopra la barra degli strumenti. Come posso sbarazzarmene
Joe Eigi

Sì, l'ho fatto e compare ancora nel mio layout ma è stato spostato fuori dalla vista
Joe Eigi,


4

Ho risolto correttamente questi problemi. La mia soluzione è il seguente codice:

@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);
}

Sì, ho mostrato correttamente il menu. Ma come nascondere questo menu alla chiusura del frammento, intendo Quando passiamo a un altro frammento, ad esempio da a -> b, il menu di a è ancora visibile nella barra degli strumenti del frammento b.
Zeeshan Ahmed

usa setHasOptionsMenu (false) in onCreateView del frammento b.
Kannan_SJD

4

Ho avuto lo stesso problema e volevo sostituire il menu della barra degli strumenti in base al frammento visualizzato.

Il problema che sto affrontando ora è che il menu viene aggiunto a quello precedente.

Per mostrare solo il menu per il frammento, suggerisco:

@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);
}

Spero che ti aiuti.


2
controlla se menu! = null prima di chiamare .clear ()
mapo

2

Di seguito sono riportati i passaggi per mostrare diverse opzioni di menu con diversi frammenti.

Passaggio 1: chiama setHasOptionsMenu (true)

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

    }

Passaggio 2: gonfia le voci del menu delle opzioni relative ai frammenti.

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

Questo mi ha aiutato a rimuovere il pulsante di menu indesiderato che appariva sul mio nuovo menu
Im Batman,

1

All'interno di XML aggiungi questa riga

app:menu="@menu/main_menu"

1
Effettivamente hai ragione! Puoi specificarlo con xml e poi nel frammento: `` sovrascrivi 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

Usando la nuova MaterialToolbar è molto facile creare un menu di overflow e usarlo per:

<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"/>

e poi nel codice per impostare OnCLick Listeners basta aggiungere questo:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.