onCreateOptionsMenu all'interno di Frammenti


182

Ho inserito l' setHasOptionsMenu(true)interno onCreateView, ma non riesco ancora a chiamare onCreateOptionsMenuall'interno dei frammenti.

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

Di seguito è il mio onCreateOptionsMenucodice.

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    getSupportMenuInflater().inflate(R.menu.layout, menu);
    return (super.onCreateOptionsMenu(menu));
}

Il messaggio di errore che visualizzo:

Il metodo onCreateOptionsMenu(Menu)di tipo Frammento deve sovrascrivere o implementare un metodo supertipo.


1
Grazie per 'setHasOptionsMenu (true);', lo stavo cercando.
Fabricio PH,

Risposte:


497

prova questo,

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

E in onCreateaggiunta questa linea per far apparire le opzioni nel tuoToolbar

setHasOptionsMenu(true);

182
non verrà chiamato se non aggiungi questa linea:setHasOptionsMenu(true);
Yoann Hercouet,

10
onCreateOptionsMenu () per i frammenti ha argomenti diversi rispetto a Attività.
Jorge,

3
e anche un diverso tipo di ritorno come nullo a differenza del booleano di onCreateOptionsMenu () in attività come menzionato sopra ans.
Dexter,

4
Nota interessante: se si sovrascrive anche su MenùOpzioni nell'Attività contenente, verranno visualizzate entrambe le voci del menu delle opzioni.
Adam Johns

5
setHasOptionsMenu(true);deve essere chiamato onCreate()per essere completo.
Roel,

21

Hai già il file generato automaticamente res / menu / menu.xml che definisce action_settings .

Nel tuo MainActivity.java hai i seguenti metodi:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_settings:
            // do stuff, like showing settings fragment
            return true;
    }

    return super.onOptionsItemSelected(item); // important line
}

Nel onCreateView()metodo della tua chiamata al frammento:

setHasOptionsMenu(true); 

e aggiungi anche questi 2 metodi:

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_1:
            // do stuff
            return true;

        case R.id.action_2:
            // do more stuff
            return true;
    }

    return false;
}

Infine, aggiungi il nuovo file res / menu / fragment_menu.xml che definisce action_1 e action_2 .

In questo modo quando l'app visualizza il frammento, il suo menu conterrà 3 voci:

  • action_1 da res / menu / fragment_menu.xml
  • action_2 da res / menu / fragment_menu.xml
  • action_settings da res / menu / menu.xml

1
la domanda era dentro frammenti, non attività
OlivierM,

2
@OlivierM la risposta spiega il menu dei frammenti. Ho apprezzato la spiegazione di come interagisce con il menu delle attività.
Aranda,

13

Ho provato le risposte di @Alexander Farber e @Sino Raj. Entrambe le risposte sono buone, ma non ho potuto usare il menu onCreateOptions all'interno del mio frammento, fino a quando non ho scoperto cosa mancava:

Aggiungi setSupportActionBar (barra degli strumenti) nella mia attività, in questo modo:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.id.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

Spero che questa risposta possa essere utile per qualcuno con lo stesso problema.


4

Chiamata

setSupportActionBar(toolbar)

dentro

onViewCreated(...) 

di frammento

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    ((MainActivity)getActivity()).setSupportActionBar(toolbar);
    setHasOptionsMenu(true);
}

1
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_add_customer, container, false);
        setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
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.