onCreateOptionsMenu inside Fragments


182

He colocado setHasOptionsMenu(true)dentro onCreateView, pero todavía no puedo llamar onCreateOptionsMenufragmentos internos.

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

Abajo está mi onCreateOptionsMenucódigo.

@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)de tipo Fragmento debe anular o implementar un método de supertipo.


1
Gracias por el 'setHasOptionsMenu (verdadero);', estaba buscando eso.
Fabricio PH

Respuestas:


497

prueba esto,

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

Y onCreateagregue esta línea para que las opciones aparezcan en suToolbar

setHasOptionsMenu(true);

182
no se llamará si no agrega esta línea:setHasOptionsMenu(true);
Yoann Hercouet

10
onCreateOptionsMenu () para fragmentos tiene argumentos diferentes que para Actividades.
Jorge

3
y también un tipo de retorno diferente como nulo a diferencia de boolean de onCreateOptionsMenu () en la actividad como se menciona en el ans anterior.
Dexter

44
Nota interesante: si también anula onCreateOptionsMenu en su Actividad que contiene, se mostrarán los dos elementos del menú de opciones.
Adam Johns

55
setHasOptionsMenu(true);tiene que ser llamado onCreate()para estar completo.
Roel

21

Ya tiene el archivo autogenerado res / menu / menu.xml que define action_settings .

En su MainActivity.java tenga 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 onCreateView()método de su llamada Fragment:

setHasOptionsMenu(true); 

y también agregue 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 que define action_1 y action_2 .

De esta manera, cuando su aplicación muestre el Fragmento, su menú contendrá 3 entradas:

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

1
la pregunta estaba dentro de fragmentos, no actividad
OlivierM

2
@OlivierM la respuesta explica el menú de fragmentos. Aprecié la explicación de cómo interactúa con el menú de actividades.
Aranda

13

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

Agregue 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.


4

Llamada

setSupportActionBar(toolbar)

dentro

onViewCreated(...) 

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

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);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.