119

Ho inserito setHasOptionsMenu(true) all'interno di onCreateView, ma non riesco ancora a chiamare onCreateOptionsMenu all'interno di frammenti.onCreateOptionsMenu inside Fragments

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

Qui di seguito è il mio codice onCreateOptionsMenu.

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

Il messaggio di errore ottengo:

Il metodo onCreateOptionsMenu(Menu) di tipo frammento deve escludere o implementare un metodo supertipo.

+0

Grazie per la 'setHasOptionsMenu (true);', ero alla ricerca di questo. –

risposta

365

provare questo,

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

E in onCreate aggiungere questa riga per rendere disponibili le opzioni appaiono nel vostro Toolbar

setHasOptionsMenu(true); 
+1

Per qualche motivo onCreateOptionsMenu non viene chiamato nel mio frammento –

+149

non verrà chiamato se non si aggiunge questa riga: 'setHasOptionsMenu (true);' –

+9

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

18

vostro già avere il file generato automaticamente res/menù /menu.xml che definisce action_settings.

Nella tua MainActivity.java hanno 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 metodo di chiamata Frammento onCreateView():

setHasOptionsMenu(true); 

e anche aggiungere 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 la vostra applicazione visualizza il frammento, il suo menu conterrà 3 voci:

  • action_1 da res/menu/fragment_menu.xml
  • action_2 da res/menù /fragment_menu.xml
  • action_settings da res/menu /menu.xml
+0

la domanda era all'interno dei frammenti, non l'attività – OlivierM

+1

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

5

Ho provato le risposte @Alexander Farber e @Sino Raj.Entrambe le risposte sono belle, ma non ho potuto utilizzare l'onCreateOptionsMenu dentro il mio frammento, fino a quando ho scoperto quello che mancava:

Aggiungere 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 questo la risposta può essere utile per qualcuno con lo stesso problema.

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

chiamata setSupportActionBar(toolbar) all'interno onViewCreated(...) di Frammento @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ((MainActivity)getActivity()).setSupportActionBar(toolbar); setHasOptionsMenu(true); }