onCreateOptionsMenu dentro de fragmentos


He colocado setHasOptionsMenu(true) dentro de onCreateView, pero todavía no puedo llamar onCreateOptionsMenu dentro de fragmentos.

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

Abajo está mi código onCreateOptionsMenu.

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

El mensaje de error que recibo:

El método onCreateOptionsMenu(Menu) del tipo Fragment debe anular o implementar un método supertipo.

Author: JJD, 2013-03-27

5 answers

Prueba esto,

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

Y en onCreate agregue esta línea para hacer que las opciones aparezcan en su Toolbar

setHasOptionsMenu(true);
 403
Author: Sino Raj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-29 21:17:05

Ya tiene el archivo autogenerado res/menu/menu.xml defining action_settings.

En su Actividad principal.java tiene los siguientes métodos:

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

En el método onCreateView() de tu llamada de fragmento:

setHasOptionsMenu(true); 

Y también añadir estos 2 métodos:

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

Finalmente, agregue el nuevo archivo res/menu/fragment_menu.xml definir action_1 y action_2.

De esta manera, cuando la aplicación muestra el fragmento, su menú contendrá 3 entradas:

  • action_1from res/menu/fragment_menu.xml
  • action_2from res/menu/fragment_menu.xml
  • action_settingsfrom res/menu/menu.xml
 18
Author: Alexander Farber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-11 18:58:41

Probé las respuestas de @Alexander Farber y @Sino Raj. Ambas respuestas son agradables, pero no pude usar el onCreateOptionsMenu dentro de mi fragmento, hasta que descubrí lo que faltaba:

Agregar setSupportActionBar (barra de herramientas) en mi actividad, así:

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

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

Espero que esta respuesta pueda ser útil para alguien con el mismo problema.

 5
Author: Filipe de Lima Brito,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-27 00:18:22

Llamar

setSupportActionBar(toolbar)

Dentro

onViewCreated(...) 

Del Fragmento

@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);
}
 2
Author: Chanh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-30 04:21:49
 @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
Author: Keshav Gera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-12 13:15:20