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

我正在尝试为我的应用程序添加一个夜晚主题,并且浪费了将近三个小时,试图使导航抽屉中的文本和图标随着黑暗的背景变成白色。 下面是我想要在MainActivity.java中的onCreate()中做这件事的方法:

 navigationView = (NavigationView) findViewById(R.id.navigation_view); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { // This method will trigger onItemClick of navigation menu @Override public boolean onNavigationItemSelected(MenuItem menuItem) { // Checking if the item is in checked state or not, if not make it in checked state if (menuItem.isChecked()) menuItem.setChecked(false); else menuItem.setChecked(true); if (nightMode == 0) { SpannableString spanString = new SpannableString(menuItem.getTitle().toString()); spanString.setSpan(new ForegroundColorSpan(Color.WHITE), 0, spanString.length(), 0); // fix the color to white menuItem.setTitle(spanString); } 

nightMode布尔值是不相关的,因为它工作。 当夜间模式设置为开启(0)时,导航抽屉中的任何菜单项将变为白色。 但是,只有当每个项目被选中时,这显然是不方便的。 这是我的drawer_dark.xml:

  <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/unitone" android:checked="true" android:icon="@drawable/one_white" android:title="Classical Period" /> <item android:id="@+id/unittwo" android:checked="false" android:icon="@drawable/two_white" android:title="Postclassical Period" /> <item android:id="@+id/unitthree" android:checked="false" android:icon="@drawable/three_white" android:title="Early Modern Era" /> <item android:id="@+id/unitfour" android:checked="false" android:icon="@drawable/four_white" android:title="Dawn of Industrial Age" /> <item android:id="@+id/unitfive" android:checked="false" android:icon="@drawable/five_white" android:title="Modern Era" /> </group> </menu> 

我在每个项目的透明背景上使用白色图标,但在导航抽屉的黑色背景上显示为黑色。 我试过寻找一个XML解决scheme来改变文本的颜色,我抓我的头,因为我不知道为什么这是被忽视。

有人可以提供我一个dynamic的解决scheme,以获得我想要实现的? 所有的帮助表示赞赏,谢谢!

编辑:我不使用第三方库,它是支持库中提供的NavigationView。 这里是XML布局:

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer" android:layout_width="match_parent" android:layout_height="match_parent" android:elevation="7dp" tools:context=".MainActivity" android:fitsSystemWindows="true" > <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/ColorDark" /> <include layout="@layout/toolbar" /> </FrameLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:background="#000" android:layout_height="match_parent" android:layout_width="match_parent" android:layout_gravity="start" app:headerLayout="@layout/header" app:menu="@menu/drawer" /> </android.support.v4.widget.DrawerLayout> 
  <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:background="#000" android:layout_height="match_parent" android:layout_width="match_parent" android:layout_gravity="start" app:headerLayout="@layout/header" app:itemTextColor="your color" app:menu="@menu/drawer" /> 

在你的NavigationView中使用app:itemIconTint,ej:

 <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:itemTextColor="@color/customColor" app:itemIconTint="@color/customColor" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_home" app:menu="@menu/activity_home_drawer" /> 

NavigationView有一个名为setItemTextColor()的方法。 它使用一个ColorStateList

 // FOR NAVIGATION VIEW ITEM TEXT COLOR int[][] state = new int[][] { new int[] {-android.R.attr.state_enabled}, // disabled new int[] {android.R.attr.state_enabled}, // enabled new int[] {-android.R.attr.state_checked}, // unchecked new int[] { android.R.attr.state_pressed} // pressed }; int[] color = new int[] { Color.WHITE, Color.WHITE, Color.WHITE, Color.WHITE }; ColorStateList csl = new ColorStateList(state, color); // FOR NAVIGATION VIEW ITEM ICON COLOR int[][] states = new int[][] { new int[] {-android.R.attr.state_enabled}, // disabled new int[] {android.R.attr.state_enabled}, // enabled new int[] {-android.R.attr.state_checked}, // unchecked new int[] { android.R.attr.state_pressed} // pressed }; int[] colors = new int[] { Color.WHITE, Color.WHITE, Color.WHITE, Color.WHITE }; ColorStateList csl2 = new ColorStateList(states, colors); 

这是我得到答案的地方。 然后在分配我的NavigationView之后:

 if (nightMode == 0) { navigationView.setItemTextColor(csl); navigationView.setItemIconTintList(csl2); } 

我使用下面的代码来改变我的应用程序中的导航抽屉文字颜色。

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setItemTextColor(ColorStateList.valueOf(Color.WHITE)); 

在java类中试试这个

 yourNavigationView.setItemTextColor(new ColorStateList( new int [] [] { new int [] {android.R.attr.state_pressed}, new int [] {android.R.attr.state_focused}, new int [] {} }, new int [] { Color.rgb (255, 128, 192), Color.rgb (100, 200, 192), Color.WHITE } )); 

更多的select:

您也可以通过覆盖“textColorSecondary”来更改组标题

在你的styles.xml中

 <style name="AppTheme.NavigationView"> <item name="android:textColorSecondary">#FFFFFF</item> </style> 

在你的布局

 <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:menu="@menu/activity_main_menu_drawer_drawer" android:theme="@style/AppTheme.NavigationView" app:itemIconTint="@color/colorPrimary" app:itemTextColor="@color/white"/> 

您还可以定义从您的基本主题派生的自定义主题:

 <android.support.design.widget.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:id="@+id/nav_view" app:headerLayout="@layout/nav_view_header" app:menu="@layout/nav_view_menu" app:theme="@style/MyTheme.NavMenu" /> 

然后在你的styles.xml文件中:

  <style name="MyTheme.NavMenu" parent="MyTheme.Base"> <item name="android:textColorPrimary">@color/yourcolor</item> </style> 

您还可以将更多属性应用于自定义主题。

  <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:itemBackground="@drawable/drawer_item_bg" app:headerLayout="@layout/nav_header_home" app:menu="@menu/app_home_drawer" /> 

使用app:itemBackground设置物品背景

drawer_item_bg.xml

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle" > <solid android:color="@android:color/transparent" /> </shape> </item> <item android:top="-2dp" android:right="-2dp" android:left="-2dp"> <shape> <padding android:bottom="0dp" android:left="15dp" android:right="0dp" android:top="0dp"/> <solid android:color="@android:color/transparent" /> <stroke android:width="0.5dp" android:color="#CACACA" /> </shape> </item> </layer-list> 

在未来如果有人来这里使用,导航抽屉活动(由活动提示窗口中的Studio提供)

答案是 –

在MainActivity的OnCreate()之前使用它

 int[][] state = new int[][] { new int[] {android.R.attr.state_checked}, // checked new int[] {-android.R.attr.state_checked} }; int[] color = new int[] { Color.rgb(255,46,84), (Color.BLACK) }; ColorStateList csl = new ColorStateList(state, color); int[][] state2 = new int[][] { new int[] {android.R.attr.state_checked}, // checked new int[] {-android.R.attr.state_checked} }; int[] color2 = new int[] { Color.rgb(255,46,84), (Color.GRAY) }; ColorStateList csl2 = new ColorStateList(state2, color2); 

并在MainActivity中的onNavigationItemSelected()中使用(如果使用Navigation Drawer活动,则不需要编写此函数,它将被添加到MainActivity中)。

  NavigationView nav = (NavigationView) findViewById(R.id.nav_view); nav.setItemTextColor(csl); nav.setItemIconTintList(csl2); nav.setItemBackgroundResource(R.color.white); 

提示 – 在onNavigationItemSelected()中的其他条件之前添加此代码

在您的NavigationView中添加app:itemTextColor =“#fff”

  <android.support.design.widget.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" app:menu="@menu/slider_menu" android:background="@color/colorAccent" app:itemTextColor="#fff" android:id="@+id/navigation_view" android:layout_gravity="start"/>