Estoy intentando cambiar el color predeterminado para el menú de opciones, que es blanco: quiero un fondo negro para cada elemento del menú de opciones.
Probé algunas sesiones como android: itemBackground = "# 000000" en el elemento del elemento dentro del elemento del menú, pero no funcionó.
¿Cómo puedo lograr esto?
android
user-interface
layout-inflater
feragusper
fuente
fuente
Respuestas:
Después de pasar una cantidad considerable de tiempo probando todas las opciones, la única forma en que pude obtener una aplicación usando AppCompat v7 para cambiar el fondo del menú de desbordamiento fue usando el atributo itemBackground:
Probado de API 4.2 a 5.0.
fuente
Este es claramente un problema que tienen muchos programadores y al que Google aún no ha proporcionado una solución satisfactoria y compatible.
Hay muchas intenciones cruzadas y malentendidos flotando alrededor de las publicaciones sobre este tema, así que lea esta respuesta completa antes de responder.
A continuación incluyo una versión más "refinada" y bien comentada del truco de otras respuestas en esta página, que también incorpora ideas de estas preguntas muy relacionadas:
Cambiar el color de fondo del menú de Android
¿Cómo cambiar el color de fondo del menú de opciones?
Android: personaliza el menú de la aplicación (por ejemplo, color de fondo)
http://www.macadamian.com/blog/post/android_-_theming_the_unthemable/
Menú de Android Botón de alternancia de elementos
¿Es posible hacer que el fondo del menú de opciones de Android no sea translúcido?
http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx
Configurar el fondo del menú para que sea opaco
Probé este truco en 2.1 (simulador), 2.2 (2 dispositivos reales) y 2.3 (2 dispositivos reales). No tengo ninguna tableta 3.X para probar todavía, pero publicaré los cambios necesarios aquí cuando o si los tengo. Dado que las tabletas 3.X usan barras de acción en lugar de menús de opciones, como se explica aquí:
http://developer.android.com/guide/topics/ui/menus.html#options-menu
Es casi seguro que este truco no hará nada (ni daño ni beneficio) en tabletas 3.X.
EXPOSICIÓN DEL PROBLEMA (lea esto antes de disparar-responder con un comentario negativo):
El menú Opciones tiene estilos muy diferentes en diferentes dispositivos. Negro puro con texto blanco en algunos, blanco puro con texto negro en algunos. Yo y muchos otros desarrolladores deseamos controlar el color de fondo de las celdas del menú Opciones , así como el color del texto del menú Opciones .
Algunos desarrolladores de aplicaciones solo necesitan establecer el color de fondo de la celda (no el color del texto), y pueden hacerlo de una manera más limpia usando el estilo android: panelFullBackground descrito en otra respuesta. Sin embargo, actualmente no hay forma de controlar el color del texto del menú Opciones con estilos, por lo que solo se puede usar este método para cambiar el fondo a otro color que no haga que el texto "desaparezca".
Nos encantaría hacer esto con una solución documentada y preparada para el futuro, pero simplemente no hay una disponible a partir de Android <= 2.3. Por lo tanto, tenemos que usar una solución que funcione en las versiones actuales y que esté diseñada para minimizar las posibilidades de fallar o romperse en versiones futuras. Queremos una solución que vuelva a fallar con gracia al comportamiento predeterminado si tiene que fallar.
Hay muchas razones legítimas por las que uno puede necesitar controlar el aspecto de los menús de Opciones (generalmente para que coincida con un estilo visual para el resto de la aplicación), así que no me detendré en eso.
Hay un error de Google Android publicado sobre esto: agregue su apoyo destacando este error (tenga en cuenta que Google desalienta los comentarios de "yo también": solo una estrella es suficiente):
http://code.google.com/p/android/issues/detail?id=4441
RESUMEN DE SOLUCIONES HASTA AHORA:
Varios carteles han sugerido un truco relacionado con LayoutInflater.Factory. El truco sugerido funcionó para Android <= 2.2 y falló para Android 2.3 porque el truco hizo una suposición no documentada: que uno podría llamar a LayoutInflater.getView () directamente sin estar actualmente dentro de una llamada a LayoutInflater.inflate () en la misma instancia de LayoutInflater. El nuevo código en Android 2.3 rompió esta suposición y condujo a una NullPointerException.
Mi truco ligeramente refinado a continuación no se basa en esta suposición.
Además, los hacks también se basan en el uso de un nombre de clase interno no documentado "com.android.internal.view.menu.IconMenuItemView" como una cadena (no como un tipo Java). No veo ninguna forma de evitar esto y aún así lograr el objetivo establecido. Sin embargo, es posible hacer el truco de una manera cuidadosa que retroceda si "com.android.internal.view.menu.IconMenuItemView" no aparece en el sistema actual.
Nuevamente, entienda que esto es un truco y de ninguna manera estoy afirmando que esto funcionará en todas las plataformas. Pero los desarrolladores no vivimos en un mundo académico de fantasía donde todo tiene que ser según las reglas: tenemos un problema que resolver y tenemos que resolverlo lo mejor que podamos. Por ejemplo, parece poco probable que "com.android.internal.view.menu.IconMenuItemView" exista en tabletas 3.X ya que utilizan barras de acción en lugar de menús de opciones.
Finalmente, algunos desarrolladores han resuelto este problema suprimiendo totalmente el menú de opciones de Android y escribiendo su propia clase de menú (consulte algunos de los enlaces anteriores). No he probado esto, pero si tiene tiempo para escribir su propia Vista y descubrir cómo reemplazar la vista de Android (estoy seguro de que el diablo está en los detalles aquí), entonces podría ser una buena solución que no requiere ninguna hacks indocumentados.
CORTAR A TAJOS:
Aquí está el código.
Para usar este código, llame a addOptionsMenuHackerInflaterFactory () UNA VEZ desde su actividad enCreate () o su actividad enCreateOptionsMenu (). Establece una fábrica predeterminada que afectará la creación posterior de cualquier menú de opciones. No afecta los menús de opciones que ya se han creado (los hacks anteriores usaban un nombre de función de setMenuBackground (), que es muy engañoso ya que la función no establece ninguna propiedad de menú antes de regresar).
¡Gracias por leer y disfrutar!
fuente
El atributo de estilo para el fondo del menú es
android:panelFullBackground
.A pesar de lo que dice la documentación, debe ser un recurso (por ejemplo,
@android:color/black
o@drawable/my_drawable
), se bloqueará si usa un valor de color directamente.Esto también eliminará los bordes de los elementos que no pude cambiar o eliminar con la solución de primalpop.
En cuanto al color del texto, no he encontrado ninguna forma de configurarlo a través de estilos en 2.2 y estoy seguro de que lo he probado todo (que es como descubrí el atributo de fondo del menú). Necesitarías usar la solución de primalpop para eso.
fuente
Para Android 2.3, esto se puede hacer con una piratería muy fuerte:
La causa principal de los problemas con Android 2.3 es que en LayoutInflater mConstructorArgs [0] = mContext solo se establece durante las llamadas en ejecución a
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/view/LayoutInflater.java/#352
Lo probé para que funcione en Android 2.3 y aún funcione en versiones anteriores. Si algo se rompe nuevamente en versiones posteriores de Android, simplemente verá el estilo de menú predeterminado en su lugar
fuente
También encontré este problema en una aplicación que tenía que ser compatible con Gingerbread y aún conservar la mayor parte posible del estilo de los dispositivos habilitados para Holo.
Encontré una solución relativamente limpia, que funcionó bien para mí.
En el tema, uso un fondo dibujable de 9 parches para obtener un color de fondo personalizado:
Dejé de intentar diseñar el color del texto y solo usé un Spannable para establecer el color del texto de mi artículo en el código:
fuente
Así es como resolví el mío. Acabo de especificar el color de fondo y el color del texto en los estilos. es decir, res> valores> archivo styles.xml.
fuente
¡Una cosa a tener en cuenta es que ustedes están complicando demasiado el problema al igual que muchas otras publicaciones! Todo lo que necesita hacer es crear selectores dibujables con los fondos que necesite y configurarlos como elementos reales. Pasé dos horas probando sus soluciones (todas sugeridas en esta página) y ninguna funcionó. Sin mencionar que hay toneladas de errores que esencialmente ralentizan su rendimiento en esos bloques try / catch que tiene.
De todos modos, aquí hay un archivo xml de menú:
Ahora en su item1_selector:
La próxima vez que decida ir al supermercado a través de Canadá, pruebe Google Maps.
fuente
Esto funciona bien para mi
fuente
fuente
¡Gracias Marcus! Funciona en 2.3 sin problemas al corregir algunos errores de sintaxis, aquí está el código fijo
fuente
este es un archivo XML
fuente
Si desea establecer un color arbitrario, esto parece funcionar bastante bien para
androidx
. Probado en KitKat y Pie. Pon esto en tuAppCompatActivity
:Esto establece el color de
android.widget.PopupWindow$PopupBackgroundView
, que, como habrás adivinado, dibuja el color de fondo. No hay sobregiro y también puede usar colores semitransparentes.fuente