更改导航抽屉中选中的菜单项的颜色

我正在使用新的Androiddevise支持库在我的应用程序中实现导航抽屉。

我无法弄清楚如何改变一个选定的项目的颜色!

这里是菜单的xml:

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

这里是放置在android.support.v4.widget.DrawerLayout的navigationview xml:

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

感谢您的帮助 !

[编辑]我已经看过这样一个解决scheme: 改变android菜单的背景颜色 。

这似乎是一个相当黑客,我认为,与新的devise支持图书馆,一些清洁工将被引入?

那么你可以使用颜色状态资源来实现这一点。 如果你注意到你正在使用的NavigationView

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

这里不是使用@color/black@color/primary_test ,而是使用Color State List Resource 。 为此,首先在color目录内创build一个新的xml (例如drawer_item.xml)(它应该在res目录中)。如果你没有一个名为color的目录,就创build一个。

现在在drawer_item.xml里面做这样的事情

 <?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> 

最后一步是改变你的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"> 

像这样,您可以为IconTintItemTextColorItemBackground使用单独的颜色状态列表资源。

现在,当您将项目设置为选中(以xml或编程方式)时,特定项目的颜色将与未选中项目的颜色不同。

我相信app:itemBackground期望一个drawable。 所以请按照下面的步骤:

使用以下内容创build一个可绘制文件highlight_color.xml

 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="YOUR HIGHLIGHT COLOR"/> </shape> 

使用以下内容制作另一个可绘制文件nav_item_drawable.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/highlight_color" android:state_checked="true"/> </selector> 

最后在app:itemBackground添加app:itemBackground标签:

 <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"> 

这里的highlight_color.xml文件为背景定义了一个纯色可绘制的。 稍后,将此颜色绘制分配给nav_item_drawable.xmlselect器。

这对我有效。 希望这会有所帮助。

****************************** 更新 *** *******************************************

虽然上面提到的答案可以很好地控制某些属性,但是我将要描述的方式会感觉更加牢固,而且有点

所以你可以做的是,你可以像这样在NavigationView的styles.xml定义一个ThemeOverlay

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

现在将此ThemeOverlay应用于NavigationView的app:theme属性,如下所示:

 <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"> 

我希望这会有所帮助。

NavigateView中的项被点击时,需要将NavigateItem设置为true

 //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); 

NavigationView上添加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; } 

这是实现这个目标的另一种方法:

 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); } 

}