studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-fragments android-menu

android - programacion - Menú en fragmentos que no se muestran



manual de programacion android pdf (11)

Recibí consejos muy útiles para mis últimas preguntas, espero que no sea diferente esta vez :) Primero, déjame explicarte la situación. Tengo una actividad con 2 fragmentos. Para cada fragmento tengo un diseño de menú xml, el primero tiene cuatro entradas de menú, el segundo tiene solo uno. Ahora, al principio, se carga el fragmento con las cuatro entradas del menú. En su método onCreate, establecí

this.setHasOptionsMenu(true);

el método onCreateOptionsMenu

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

El archivo xml se ve así:

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_refresh" android:icon="@drawable/ic_action_search" android:title="Refresh" android:visible="true" android:showAsAction="ifRoom|withText" /> <item android:id="@+id/menu_clearall" android:icon="@drawable/ic_action_search" android:title="Clear" android:visible="true" android:showAsAction="ifRoom|withText" /> <item android:id="@+id/menu_addcontent" android:icon="@drawable/ic_action_search" android:title="Add Content" android:visible="true" android:showAsAction="ifRoom|withText" /> <item android:id="@+id/menu_newlist" android:icon="@drawable/ic_action_search" android:title="New List" android:visible="true" android:showAsAction="ifRoom|withText" /> </menu>

Esto funciona bien Todos los elementos del menú están allí, puedo hacer clic en ellos y responder. Ahora cuando hago clic en el menú "Agregar contenido", el otro fragmento se carga. Ahí también establecí

this.setHasOptionsMenu(true);

el método onCreateOptionsMenu

@Override public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) { Log.i("FragCreateList","onCreateOptionsMenu called"); super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_fragcreatelist, menu); }

El archivo xml

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_editdone" android:icon="@drawable/ic_action_search" android:title="Edit Done" android:visible="true" android:showAsAction="ifRoom|withText" /> </menu>

Pero en el nuevo fragmento no puedo ver ningún elemento del menú. Ni en la barra de acciones, ni cuando presiono el botón de menú de hardware. En el fragmento anterior, dos elementos del menú estaban en la barra de acciones, los otros dos aparecían cuando se presionó el botón de hardware. Pero aquí no se muestra nada. Recibo el mensaje de logcat de que se llamó al método onCreateOptionsMenu, pero no ocurre nada. (Incluso recibo una llamada a mi método (vacío) onPrepareOptionsMenu, que debería llamarse justo antes de que se muestre el menú, todavía nada) ¿Alguna pista de lo que podría estar mal? Llamar a invalidateOptionsMenu no hace nada. Además, no sé con certeza a cuál llamar, ya que hay un getActivity (). InvalidateOptionsMenu y un getFragmentManager (). InvalidateOptionsMenu ... Gracias de antemano.

Editar:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="15" />


Cuando se registra para las opciones / menús contextuales en fragmentos, generalmente necesita esperar hasta la llamada onActivityCreated () para asegurarse de que haya una actividad para vincular el menú. Pruebe la solución sugerida aquí y vea si ayuda:

Menú contextual de un ListFragment


Esto realmente funciona para mí y podría ser tu solución también.

@Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); }


Esto sucede porque su dispositivo tiene un botón de menú de hardware. Por lo tanto, el valor de la variable "sHasPermanentMenuKey" es verdadero en ViewConfiguration hasPermanentMenuKey() . Debes poner el valor de esta variable en falso usando reflection. Ejemplo:

// this method force showing menu button in device with hardware menu button private void showOverflowMenu(FragmentActivity activity) { try { ViewConfiguration config = ViewConfiguration.get(activity); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if (menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception e) { e.printStackTrace(); } }

NOTA: use este método en onCreate () de actividad no en el método onCreate () de fragmento.


Intenta cambiar onCreateOptionsMenu a onPrepareOptionsMenu en fragmentos, tuve el mismo problema y, por lo que recuerdo, esto lo resolvió para mí ...


Para una clase de fragmento, para que pueda ver su menú, agregue sethasoptionsmenu (true) en el método onCreateView () o el método onCreateAcivity (). Pero agregué el mío al método onCreateView (). Espero que ayude a alguien


Su actividad necesita extender ActionBarActivity . Puede tener uno que solo amplíe la Actividad. texto fuerte


Una adición muy tarde ya que ninguna de las sugerencias anteriores resolvió mi problema. Mi dispositivo (2.3.5) tuvo un problema de sincronización tan malo con el menú de opciones que tuve que tomar una ruta diferente y crear el menú en la pieza de preparación utilizando el inflador de la actividad:

@Override public void onPrepareOptionsMenu(Menu menu) { if (Build.VERSION.SDK_INT < 11) { menu.clear(); getActivity().getMenuInflater().inflate(R.menu.message_thread, menu); }


Use menu.clear () antes de inflar los menús.

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


Yo tuve el mismo problema. Lo arreglé usando el showAsAction en el elemento aplicado al contexto myApp :

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:myapp="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_refresh" android:icon="@drawable/ic_refresh" android:title="refresh" android:visible="true" myapp:showAsAction="ifRoom|withText"/> </menu>

Lo siento, ya es demasiado tarde para ti, pero puede ser útil para otras personas.


en primer lugar su fragmento debe tener en el onCreate

setHasOptionsMenu(true);

y luego tienes que verificar que tu actividad NO tenga el tema NoActionBar como si fuera un poco complicado, pero si tu actividad tiene ese tema, no importa dónde llames setHasOptionsMenu(true) tu fragmento no la pintará


Agregué setHasOptionsMenu (verdadero) en onCreateView y funciona bien

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