Cambiar el color de un elemento del menú marcado en un panel de navegación

Estoy utilizando la nueva biblioteca Android Design Support para implementar un cajón de navegación en mi aplicación.

¡No puedo imaginar cómo cambiar el color de un elemento seleccionado!

Aquí está el xml del menú:

     

Y aquí está el navigationview xml que se coloca dentro de un android.support.v4.widget.DrawerLayout :

    

Gracias por tu ayuda !

[EDITAR] Ya he visto soluciones como esta: cambiar el color de fondo del menú de Android .

Parece bastante complicado y pensé que con la nueva Biblioteca de soporte de diseño, ¿se habría introducido algo más limpio?

Bueno, puedes lograr esto usando Color State Resource . Si observa dentro de su NavigationView que está utilizando

 app:itemIconTint="@color/black" app:itemTextColor="@color/primary_text" 

Aquí en lugar de usar @color/black o @color/primary_test , use un Color State List Resource . Para eso, primero crea un nuevo xml (por ejemplo, drawer_item.xml) dentro del directorio de color (que debe estar dentro del directorio res ). Si aún no tienes un directorio llamado color , crea uno.

Ahora dentro de drawer_item.xml haz algo como esto

      

El paso final sería cambiar tu NavigationView

  

De esta manera, puede usar recursos de lista de estado de color separados para IconTint , ItemTextColor , ItemBackground .

Ahora cuando establece un elemento como marcado (ya sea en xml o programáticamente), el artículo en particular tendrá un color diferente al de los no marcados.

Creo que la app:itemBackground espera un app:itemBackground . Por lo tanto, siga los pasos a continuación:

Cree un archivo seleccionable highlight_color.xml con los siguientes contenidos:

    

Cree otro archivo nav_item_drawable.xml con los siguientes contenidos:

    

Finalmente agregue la app:itemBackground etiqueta app:itemBackground en NavView:

  

aquí el archivo highlight_color.xml define un color sólido dibujable para el fondo. Más tarde, este dibujante de color se asigna al selector nav_item_drawable.xml.

Esto funcionó para mí. Espero que esto ayude.

********************************************** ACTUALIZADO *** *******************************************

Aunque la respuesta mencionada anteriormente le da un buen control sobre algunas propiedades, pero la forma en que estoy a punto de describir se siente más SÓLIDO y es un poco más COOLER .

Entonces, lo que puedes hacer es definir un ThemeOverlay en styles.xml para NavigationView de la siguiente manera:

   

ahora aplique este ThemeOverlay a la app:theme atributo de app:theme de NavigationView, así:

  

Espero que esto sea de ayuda.

Hay que configurar NavigateItem verificado verdadero siempre que se NavigateView clic en el elemento en NavigateView

 //listen for navigation events NavigationView navigationView = (NavigationView)findViewById(R.id.navigation); navigationView.setNavigationItemSelectedListener(this); // select the correct nav menu item navigationView.getMenu().findItem(mNavItemId).setChecked(true); 

Agregar NavigationItemSelectedListener en NavigationView

  @Override public boolean onNavigationItemSelected(final MenuItem menuItem) { // update highlighted item in the navigation menu menuItem.setChecked(true); mNavItemId = menuItem.getItemId(); // allow some time after closing the drawer before performing real navigation // so the user can see what is happening mDrawerLayout.closeDrawer(GravityCompat.START); mDrawerActionHandler.postDelayed(new Runnable() { @Override public void run() { navigate(menuItem.getItemId()); } }, DRAWER_CLOSE_DELAY_MS); return true; } 

Aquí está la otra forma de lograr esto:

 public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { item.setEnabled(true); item.setTitle(Html.fromHtml("Settings")); return false; } }); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } 

}