2012-07-07 28 views
7

Tuve un problema al configurar algunos elementos del menú de fragmentos en el ActionBar y encontré la manera de resolverlo, pero no entiendo por qué funcionó.Usar onPrepareOptionsMenu en lugar de onCreateOptionsMenu en el fragmento

Quería cambiar la visibilidad en un elemento del menú justo después de inflarlo desde un archivo de menú xml en el método onCreateOptionsMenu. El código parece funcionar bien, pero no hay efecto visible. Resolví el problema inflando el menú en el método onCreateOptionsMenu pero cambiando la visibilidad del mismo en el método onPrepareOptionsMenu.

Lo que quiero saber es por qué cambiar la visibilidad en onCreateOptionsMenu no funciona.

¿Qué puedo hacer en onPrepareOptionsMenu que no puedo hacer en onCreateOptionsMenu?

¿Hay algún patrón a seguir aquí?

Gracias!

Aquí está el código en cuestión, por si acaso:

public class MyFragment extends Fragment { 

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

     // This does not work, compiles and runs fine, but has no visible effect 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     // This does work 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 
} 
+1

No estoy seguro, pero el [Documentación] (http://developer.android.com/reference/android/app/Activity. html # onCreateOptionsMenu (android.view.Menu)) dice: "_ ... Para actualizar el menú cada vez que se muestra, consulte [onPrepareOptionsMenu (Menu)] (http://developer.android.com/reference/android/app/ Activity.html # onPrepareOptionsMenu (android.view.Menu)) ._ " –

+1

¡Gracias por el comentario! Lo que pasa es que no necesito 'actualizarlo cada vez que se muestra' (se muestra todo el tiempo, no hay submenús), solo quiero configurar el menú una sola vez, cuando se crea/infla y eso es todo . Muy bien, puede parecer lo mismo en mi situación, pero el objetivo de mi pregunta es entender por qué funciona así. ¿Por qué tengo que 'reconfigurar' el menú cada vez que se muestra cuando puedo hacerlo solo una vez cuando lo creo? –

+0

Entiendo y acepto que debería ser una opción. Sin embargo, en mi opinión, creo que es la forma en que funciona Android. En algunos casos, puede codificar las propiedades del menú con atributos xml. –

Respuesta

5

Debe llamar al super.onCreateOptionsMenu(menu, inflater); después de haber creado su menú, no antes. Eso envía el menú hacia arriba en la jerarquía y otros fragmentos o la actividad puede querer agregar elementos.

La actividad es responsable de mostrar y administrar el menú, por lo que si cambia la visibilidad después de que se haya enviado a la actividad, no pasará mucho.

Ahora, cuando llame al super.onPrepareOptionsMenu(menu);, "preparará" su menú, pero ahora tendrá en cuenta los cambios que ha realizado en el onCreateOptionsMenu.

+1

nice - elimina esta línea porque tienes razón "_Pienso que_" – Elltz

+0

Hecho- gracias por confirmar. – Christian

0

puede ser el código debe devolver true para que el menú visible, eso significa que usted debe poner return true; declaración en tanto onCreateOptionsMenu() y onPrepareOptionsMenu().

Espero que esto ayude.

+5

onCreateOptionsMenu devuelve void – Axarydax

+1

En realidad, hay DOS métodos onPrepareOptions(). El [primer] (http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu (android.view.Menu)), para la clase Activity, devuelve un valor-- si es verdadero no devuelto, el menú no se mostrará. La versión de [Fragment] (http://developer.android.com/reference/android/app/Fragment.html#onPrepareOptionsMenu (android.view.Menu)) no. La versión de Fragment requiere API 11 vs API 1 para la versión de la Actividad. Algo interesante. – fattire

0

Uso el onPrepareOptionsMenu para actualizar qué elementos en el menú deberían estar activos y cuáles deberían aparecer atenuados o eliminados dependiendo del estado actual de la actividad. Use el método setVisible del elemento de menú para controlar si se muestra actualmente en el menú o no.

-2

Esto funciona para mí

public class ContentFragment extends android.support.v4.app.Fragment { 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.content_frame,container,false); 
    setHasOptionsMenu(true); 
    return v; 
} 

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

probarlo

+0

Esto me funciona, pero quiero saber cómo usar el método invalidateoptionsmenu() para el cambio dinámico –

+0

si hay algún código relacionado con la actualización dinámica del menú y por favor déjenme saber. –

Cuestiones relacionadas