NavigationDrawer (NavigationView) tiene tres opciones para la configuración de elementos marcados / seleccionados.
app:itemIconTint="@color/menu_text_color"
app:itemTextColor="@color/menu_text_color"
app:itemBackground="@drawable/menu_background_color"
Color de icono y texto
Las dos primeras opciones (icono y texto) necesitan un recurso de lista de estado de color : https://developer.android.com/guide/topics/resources/color-list-resource.html .
Dicho menu_text_color
recurso debe crearse en res / color . El contenido de este archivo debe tener un aspecto similar a:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorWhite" android:state_checked="true" />
<item android:color="@color/colorBlack" android:state_checked="false"/>
</selector>
He creado un recurso para ambos, pero es posible crear dos archivos separados: uno para texto y otro para icono.
Fondo (itemBackground)
La opción de fondo necesita un recurso dibujable en lugar de color, cada intento de establecer el color terminará con una excepción. El recurso dibujable debe crearse en res / drawable y su contenido debe ser similar a:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/transparent" android:state_checked="false"/>
<item android:drawable="@color/colorPrimary" android:state_checked="true"/>
</selector>
No es necesario crear ningún elemento de diseño que simule el color (en otras soluciones vi tales propuestas, tal vez para la versión sdk anterior), el color se puede usar en este archivo directamente. En este archivo de ejemplo, estoy usando un color transparente para el elemento no marcado y colorPrimary
para el elemento marcado.
Solución de problemas y notas importantes
- En el recurso de fondo, utilice siempre state_checked = "false" en lugar del predeterminado, con el color predeterminado no funcionará
- Para el menú creado dinámicamente / programáticamente, recuerde establecer los elementos como marcables :
Ejemplo de código (agregar elemento de menú dinámico):
menu.add(group_id, item_id, Menu.NONE, item_name).setCheckable(true).setChecked(false);
Si los elementos no se configuran como comprobables, el fondo no funcionará (el color del texto y el icono sorprendente funcionarán como se esperaba).