android - support - Cambiar el color de un elemento de menú marcado en un cajón de navegación
material design library android (5)
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("<font color=''#ff3824''>Settings</font>"));
return false;
}
});
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Estoy usando la nueva biblioteca de Android Design Support para implementar un cajón de navegación en mi aplicación.
¡No puedo entender cómo cambiar el color de un elemento seleccionado!
Aquí está el xml del menú:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/navigation_item_1"
android:icon="@drawable/ic_1"
android:title="@string/navigation_item_1"/>
<item
android:id="@+id/navigation_item_2"
android:icon="@drawable/ic_2"
android:title="@string/navigation_item_2"/>
</group>
Y aquí está el xml de navigationview que se coloca dentro de un
android.support.v4.widget.DrawerLayout
:
<android.support.design.widget.NavigationView
android:id="@+id/activity_main_navigationview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:itemIconTint="@color/black"
app:itemTextColor="@color/primary_text"
app:menu="@menu/menu_drawer">
<TextView
android:id="@+id/main_activity_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginBottom="@dimen/activity_vertical_margin"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:textColor="@color/primary_text" />
</android.support.design.widget.NavigationView>
Gracias por tu ayuda !
[EDITAR] Ya he visto soluciones como esta: Cambiar el color de fondo del menú de Android .
Parece ser un truco y pensé que con la nueva Biblioteca de soporte de diseño, ¿se habría introducido algo más limpio?
Así es como puedes hacerlo en el método onCreate de tu Actividad:
NavigationView navigationView = findViewById(R.id.nav_view);
ColorStateList csl = new ColorStateList(
new int[][] {
new int[] {-android.R.attr.state_checked}, // unchecked
new int[] { android.R.attr.state_checked} // checked
},
new int[] {
Color.BLACK,
Color.RED
}
);
navigationView.setItemTextColor(csl);
navigationView.setItemIconTintList(csl);
Bueno, puedes lograr esto usando
Color State Resource
.
Si observa dentro de su
NavigationView
, está usando
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 cree un nuevo
xml
(por ejemplo, drawer_item.xml) dentro del directorio de
color
(que debería estar dentro del directorio
res
). Si aún no tiene un directorio llamado
color
, cree uno.
Ahora dentro de
drawer_item.xml
haz algo como esto
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="checked state color" android:state_checked="true" />
<item android:color="your default color" />
</selector>
El último paso sería cambiar su
NavigationView
<android.support.design.widget.NavigationView
android:id="@+id/activity_main_navigationview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:itemIconTint="@color/drawer_item" // notice here
app:itemTextColor="@color/drawer_item" // and here
app:itemBackground="@android:color/transparent"// and here for setting the background color to tranparent
app:menu="@menu/menu_drawer">
De esta manera, puede usar recursos de la Lista de estados de color separados para
IconTint
,
ItemTextColor
,
ItemBackground
.
Ahora, cuando configura un elemento como marcado (ya sea en
xml
o mediante programación), el elemento particular tendrá un color diferente al de los no seleccionados.
Creo que la
app:itemBackground
espera un
app:itemBackground
.
Entonces siga los pasos a continuación:
Cree un archivo dibuja
highlight_color.xml
con los siguientes contenidos:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="YOUR HIGHLIGHT COLOR"/>
</shape>
Cree otro archivo
nav_item_drawable.xml
con los siguientes contenidos:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/highlight_color" android:state_checked="true"/>
</selector>
Finalmente, agregue la etiqueta
app:itemBackground
en NavView:
<android.support.design.widget.NavigationView
android:id="@+id/activity_main_navigationview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:itemIconTint="@color/black"
app:itemTextColor="@color/primary_text"
app:itemBackground="@drawable/nav_item_drawable"
app:menu="@menu/menu_drawer">
aquí el archivo highlight_color.xml define un color sólido dibujable para el fondo. Más tarde este color dibujable se asigna al selector nav_item_drawable.xml.
Esto funcionó para mí. Esperemos que esto ayude.
********************************************** ACTUALIZADO *** *******************************************
Aunque la respuesta mencionada anteriormente le brinda un control preciso sobre algunas propiedades, pero la forma en que estoy a punto de describir se siente más SÓLIDA y es un poco más FRESCO .
Entonces, lo que puede hacer es definir una
styles.xml
de
styles.xml
en
styles.xml
para NavigationView de la siguiente manera:
<style name="ThemeOverlay.AppCompat.navTheme">
<!-- Color of text and icon when SELECTED -->
<item name="colorPrimary">@color/color_of_your_choice</item>
<!-- Background color when SELECTED -->
<item name="colorControlHighlight">@color/color_of_your_choice</item>
</style>
ahora aplique este ThemeOverlay a la
app:theme
atributo de
app:theme
de NavigationView, así:
<android.support.design.widget.NavigationView
android:id="@+id/activity_main_navigationview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:theme="@style/ThemeOverlay.AppCompat.navTheme"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/menu_drawer">
Espero que esto sea de ayuda.
Es necesario establecer
NavigateItem
marcado como verdadero cada vez que se hace clic en un elemento de
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;
}