2012-08-23 23 views
37

Recibí sugerencias 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 puseMenú en Fragmentos que no muestran

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 es el siguiente:

<?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. Allí me puse así

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 los elementos de 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" /> 
+0

De las respuestas, parece que esto puede ser causado por muchas cosas. Tenía este problema porque yo estaba usando un FragmentActivity en lugar de un AppCompatActivity, y funcionó tan pronto como he cambiado – TallChuck

Respuesta

0

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

+0

que se cambió a \t @ Override \t vacío onPrepareOptionsMenu (menú Menú) pública { \t \t Log.i ("FragCreateList "," onPrepareOptionsMenu llamado "); \t \t MenuInflater inflater = new MenuInflater (getActivity()); \t \t inflater.inflate (R.menu.menu_fragcreatelist, menú); \t \t \t} pero todavía nada ... nada se muestra. –

+0

Extraño, tengo actividad con dos fragmentos, esquema clásico, la actividad misma tiene un menú y cada fragmento tiene su propio menú. Tengo onCreateOptionsMenu en actividad y onPrepareOptionsMenu en fragmentos. Y tengo los tres menús mostrados combinados ... – Dimanoid

+0

Tal vez no entendimos bien, no quiero todos mis menús combinados, quiero que esos dos menús se muestren en dos fragmentos separados, pero solo un fragmento muestra un menú. Primero también tenía onCreateOptions en mi actividad, pero me moví a fragmentos, ya que pensé que tenía más sentido.Acabo de resolver mi problema con un enfoque de diseño diferente, todavía me gustaría saber por qué no funciona :) Gracias por el esfuerzo. –

2

Al registrarse en Opciones/menús contextuales en fragmentos, generalmente necesita esperar hasta la llamada onActivityCreated() para asegurarse de que haya una actividad para vincular el menú. Ensayar el camino sugerido aquí y ver si ayuda:

Context menu from a ListFragment

+0

Hola, jsmith, se trata de menús contextuales, estoy hablando de los elementos del menú de la barra de acciones o los elementos del menú del botón de hardware, respectivamente. –

+2

Sí, entendí eso. Al leer el problema, parecía implicar que llamas a setHasOptionsMenu (verdadero) en los fragmentos en Crear. Sugiero que lo mueva al método onActivityCreated() para ambos fragmentos. Esto se aplica a los menús de opciones y los menús contextuales. – jsmith

50

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

gracias, me ayudaron. –

+0

Funcionó para mí también –

+3

+1 Tenga en cuenta que la supercompañía debe estar por encima de los métodos claro e inflar. De lo contrario, se muestra en modo de desbordamiento. – Praveen

8

Tuve el mismo problema. Me fijo mediante el uso de la showAsAction este artículo aplicada 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> 

este momento ya es demasiado tarde para usted, pero puede ser útil para otras personas.

+3

Nota: El uso de 'android: showAsAction' parece no tener ningún efecto cuando se utiliza el Fragmento de soporte, por lo que la configuración del segundo espacio de nombres con res auto es fundamental. Gracias por la ayuda. –

+0

+1 @aglour para este nugget, tenía todo lo demás configurado y estaba usando Support V4 como lo menciona Eric, no puedo ver cómo habría arreglado esto de lo contrario, gracias. – WickedW

72

que añade 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); 

} 
+3

funcionó para mí ... Gracias –

+0

sí, está funcionando. – venkat

5

Esto sucede porque el dispositivo tiene 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: utilizar este método en onCreate() de actividad no en el método onCreate() de fragmento.

-1

Una adición muy tarde ya que ninguna de las sugerencias anteriores resolvió mi problema. Mi dispositivo (2.3.5) tenía un problema de tiempo tan mala con el menú de opciones que tenía que ir a una ruta diferente y crear el menú en la parte onprepare mediante el inflado 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); 
    } 
0

Sus necesidades de actividad para extender ActionBarActivity. Puede tener uno que solo amplíe la Actividad. texto fuerte

4

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

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

Para una clase fragmento con el fin de que usted pueda ver el menú de añadir sethasoptionsmenu (verdadero) o bien en el método onCreateView() o el método onCreateAcivity(). Pero agregué el mío al método onCreateView(). Esperamos que ayude a alguien

2

en primer lugar el fragmento tiene que tener en el onCreate

setHasOptionsMenu(true); 

y luego se tiene que comprobar que su actividad no tiene el NoActionBar como tema es un poco de difícil, pero si su la actividad tiene ese tema, no importa dónde llame al setHasOptionsMenu(true) que fragmento no pintará su

Cuestiones relacionadas