2015-06-09 17 views
40

Ho una barra degli strumenti e un cassetto di navigazione. Quando avvio la mia app, vengono creati la barra degli strumenti e il pannello di navigazione. Quando faccio clic sugli elementi nel cassetto di navigazione, vengono avviati nuovi frammenti e viene mantenuta la stessa barra degli strumenti. Come faccio ad aggiungere fondamentalmente voci di menu alla barra degli strumenti come ricerca, aggiungi, modifica alla barra degli strumenti quando avvio frammenti specifici. Non li voglio all'inizio del programma, ma creati dinamicamente. Inoltre, come potrei fare clic su questi pulsanti e farli avviare altri frammenti. Lo voglio 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!Barra degli strumenti Android Aggiunta di voci di menu per diversi frammenti

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

Toolbar:

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

risposta

6

Override onCreateOptionsMenu metodo in ogni vostra frammento.

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

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

+0

@JoeEigi sì, puoi avere un menu personalizzato gonfiando il menu personalizzato xml. Chiama 'setTitle()' può aggiungere titoli. –

+0

@JoeEigi Sembra che tu abbia il contesto sbagliato, dai un'occhiata a questo: http://stackoverflow.com/questions/26998455/how-to-get-toolbar-from-fragment –

21

Questo è come creare menù dinamico: 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); 
+0

La migliore risposta per creare menu e barra degli strumenti nella barra degli strumenti. – user2681579

+1

usa 'actionBarToolbar.setOnMenuItemClickListener()' per gestire le azioni delle voci di menu. 'onOptionsItemSelected()' non viene chiamato in questa situazione. –

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

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

+0

Dove mettere questo codice? Posso inserire MainActivity? – Faisal

+2

Non è possibile mettere questo codice in attività, si aggiunge questo codice in cui si mostra la voce di menu in particolare frammento. codice aggiunto in frammento. –

3

ho risolto correttamente questi problemi. La mia soluzione è come 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); 
} 
+0

Sì, ho mostrato il menu correttamente. Ma come nascondere questo menu sulla chiusura dei frammenti, intendo quando passiamo a un altro frammento, ad es. da a -> b, il menu di un oggetto ancora visibile nella barra degli strumenti del frammento b. –

+0

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

+0

questa dovrebbe essere la risposta corretta lol. Ben fatto amico mio –

0

ho avuto lo stesso problema e ho voluto sostituire il menu della barra degli strumenti di conseguenza per il frammento visualizzato.

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

Al fine di 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 aiuto.

2

Il modo migliore per farlo: barra degli strumenti

1. Trovare in attività e impostarlo come supportActionBar.

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

2. Allora sarà un pezzo di torta per gestire i menu di opzione per diversi frammenti su una stessa attività. Do seguenti cose in ogni frammento come si vuole:

In Metodo OnCreateView chiamata

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 gli elementi menu del tasto, 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); 
    } 
} 
Problemi correlati