Android: personalizar el menú de la aplicación (por ejemplo, color de fondo)

¿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:

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

    No con el marco de menú incorporado.

    Puedes interceptar el botón MENÚ (a través onKeyDown() o algo así) y renderizar lo que quieras, pero ten en cuenta que los usuarios esperarán que se vea como el rest de los menús en su dispositivo.

    Creé mi propia clase de menú. Quizás no sea exactamente lo que quieres, pero con suerte debería comenzar. Aquí está el artículo que publiqué y un enlace descargable al código fuente.

    http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx

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

    En mi juego, lo implementé para mostrar un cuadro de diálogo “Juego en pausa” cuando se presiona el botón de menú …

    Usa estilos. Esto funciona para mí en Android 5.0

       

    … entonces el dibujable es un selector regular

     < ?xml version="1.0" encoding="utf-8"?>     

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

     @android:color/darker_gray 

    Esta respuesta funciona pero se estrelló cuando uso 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 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(); }