2009-10-20 17 views
18

¿Cuál es el camino (si hay una forma) para personalizar el menú (el que se activa con el botón MENÚ del teléfono). Estoy especialmente interesado en dos cosas:Android: personalizar el menú de la aplicación (por ejemplo, color de fondo)

  • cambiar el color de fondo del gris claro estándar en un gris más oscuro
  • cómo están alineados los elementos del menú. Tengo 4 elementos y se alinean automáticamente 2x2, pero preferiría tenerlos todos en una línea (1x4)
+0

Ahora, esta pregunta es viejo, pero para aquellos que buscan personalizar ** desbordamiento de la barra de acciones * * color de fondo del menú (por ejemplo, en Android 4.0+), consulte esta solución: http://stackoverflow.com/a/20077381/56285 – Jonik

Respuesta

8

No con el marco de menú incorporado.

Puede interceptar el botón MENÚ (a través del onKeyDown() o algo similar) y renderizar lo que desee, pero tenga en cuenta que los usuarios esperarán que se vea como el resto de los menús en su dispositivo.

+1

Gracias. Luego omitiré esto por ahora y quizás lo implementaré en un momento posterior cuando haya más tiempo. – znq

+0

he visto arreglos de menús personalizados (como se ve aquí http://androidandme.com/wp-content/uploads/2009/12/05.categories_optionmenu.jpg) así que debe haber una manera de hacerlo. – mtmurdock

+0

@mtmurdock: no con el marco de menú incorporado. – CommonsWare

4

También puede implementar el método "onCreateOptionsMenu", que generalmente se utiliza para mostrar el menú estándar, y mostrar lo que desee en este caso.

En mi juego, he implementado para mostrar un cuadro de diálogo "Juego En pausa" cuando se pulsa el botón de menú ...

1

color de fondo del menú en style.xml en su tema

<item name="android:panelFullBackground">@android:color/darker_gray</item> 
0

This answer obras, pero para mí se estrelló cuando se utiliza ActionBarSherlock. Aquí hay una solución estrafalaria para hacer que esto funcione sin excepción.

// Black Vodoo! Do not try this at home. 

    final LayoutInflater li = getLayoutInflater(); 

    final Class<LayoutInflater> clazz = LayoutInflater.class; 

    try { 
     final Field fieldSet = clazz.getDeclaredField("mFactorySet"); 
     fieldSet.setAccessible(true); 
     fieldSet.setBoolean(li, false); 

     li.setFactory(new Factory() { 

      @Override 
      public View onCreateView(final String name, 
        final Context context, final AttributeSet attrs) { 
       if (name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) { 
        try { 
         final LayoutInflater f = getLayoutInflater(); 
         final View view = f.createView(name, null, attrs); 
         new Handler().post(new Runnable() { 
          @Override 
          public void run() { 
           // Set the text color 
           ((TextView) view).setTextColor(Color.WHITE); 
          } 
         }); 
         return view; 
        } catch (final Exception e) { 
        } 
       } 
       return null; 
      } 
     }); 
    } catch (final Exception e) { 
     e.printStackTrace(); 
    } 
3

Utilice los estilos. Esto funciona para mí en Android 5,0

<style name="AppTheme" parent="android:Theme.Material.Light"> 
    <item name="android:colorPrimary">@color/primary</item> 
    <item name="android:actionOverflowMenuStyle">@style/PopupMenu.MyStyle</item> 
</style> 

<style name="PopupMenu.MyStyle" parent="android:Widget.PopupMenu"> 
    <item name="android:popupBackground">@drawable/actionbar_item_background</item> 
</style> 

... entonces el dibujable es un selector regulares

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@color/primary"/> 
    <item android:drawable="@color/highlighted" android:state_pressed="true"/> 
</selector> 
Cuestiones relacionadas