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

Posted

技术标签:

【中文标题】更改导航抽屉中菜单项的文本颜色【英文标题】:Changing text color of menu item in navigation drawer 【发布时间】:2015-11-09 15:24:17 【问题描述】:

我正在尝试为我的应用程序添加一个夜间主题,我浪费了近三个小时来尝试让导航抽屉中的文本和图标随着深色背景变为白色。这是我在onCreate()MainActivity.java 中尝试执行此操作的方式:

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 解决方案来更改文本的颜色,但我正在摸不着头脑,因为我不知道为什么会忽略这一点。

有人可以为我提供动态解决方案来实现我想要实现的目标吗?感谢所有帮助,谢谢!

编辑:我没有使用第三方库,它是支持库中提供的 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_
    android:layout_
    android:elevation="7dp"
    tools:context=".MainActivity"
    android:fitsSystemWindows="true" >

    <FrameLayout
        android:layout_
        android:layout_
        android:orientation="vertical">

        <FrameLayout
            android:id="@+id/container"
            android:layout_
            android:layout_
            android:background="@color/ColorDark" />

        <include layout="@layout/toolbar" />

    </FrameLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:background="#000"
        android:layout_
        android:layout_
        android:layout_gravity="start"
        app:headerLayout="@layout/header"
        app:menu="@menu/drawer" />

</android.support.v4.widget.DrawerLayout>

【问题讨论】:

你为什么不把活动主题从Light改为Dark,反之亦然.. @Boss 对于我的应用程序的编程方式,这将是一个乏味的过程。除了我的导航抽屉外,我的这个日夜主题在其他任何地方都能完美运行,所以我需要的只是解决这个问题。 【参考方案1】:
 <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:background="#000"
        android:layout_
        android:layout_
        android:layout_gravity="start"
        app:headerLayout="@layout/header"
        app:itemTextColor="your color"
        app:menu="@menu/drawer" />

【讨论】:

这会将导航抽屉的每个项目的颜色设置为“您的颜色”。有没有办法为每组抽屉单独更改颜色? @Akeshwar,您可以尝试以编程方式执行此操作,但是,我不建议这样做,因为它违反了材料指南。 是的,还有一种方法可以单独更改颜色! @NehaTyagi 如何从 xml 更改菜单项中的字体样式。 @Hara Hara Mahadevaki 你能告诉我吗?【参考方案2】:

在 NavigationView 中使用 app:itemIconTint,ej:

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_
    android:layout_
    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" />

【讨论】:

那么所选项目的文字颜色呢?【参考方案3】:

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

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

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

【讨论】:

你好,有没有办法单独改变每组导航抽屉的颜色? 还是灰色 如何更改群组文字颜色?【参考方案4】:

更多选项:

您还可以通过覆盖“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_
    android:layout_
    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"/>

【讨论】:

这个解决方案帮助我解决了我的颜色问题。谢谢!【参考方案5】:

在您的 NavigationView 中添加 app:itemTextColor="#fff" 就像

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

【讨论】:

【参考方案6】:

我使用下面的代码在我的应用中更改导航抽屉文本颜色。

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

【讨论】:

【参考方案7】:

你可以在

中使用drawables

app:itemTextColor 应用程序:itemIconTint

然后你可以使用drawable控制检查状态和正常状态

<android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_
            android:layout_
            android:layout_gravity="start"
            app:itemHorizontalPadding="@dimen/margin_30"
            app:itemIconTint="@drawable/drawer_item_color"
            app:itemTextColor="@drawable/drawer_item_color"
            android:theme="@style/NavigationView"
            app:headerLayout="@layout/nav_header"
            app:menu="@menu/drawer_menu">

drawer_item_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/selectedColor" android:state_checked="true" />
    <item android:color="@color/normalColor" />
</selector>

【讨论】:

【参考方案8】:

将来如果有人来这里使用, Navigation Drawer Activity(由 Studio 在 Activity Prompt 窗口中提供)

答案是——

在 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() 中的 If else 条件之前添加此代码

【讨论】:

【参考方案9】:

这对我有用。代替 customTheme 你可以把你的主题放在样式中。在此代码中,您还可以更改字体和文本大小。

    <style name="MyTheme.NavMenu" parent="CustomTheme">
            <item name="android:textSize">16sp</item>
            <item name="android:fontFamily">@font/ssp_semi_bold</item>
            <item name="android:textColorPrimary">@color/yourcolor</item>
        </style>

这是我的导航视图

<android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_
        android:layout_
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:theme="@style/MyTheme.NavMenu"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer">

        <include layout="@layout/layout_update_available"/>

    </android.support.design.widget.NavigationView>

【讨论】:

【参考方案10】:

您只需将主题添加到导航视图即可。

    <android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_
    android:layout_
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    android:background="@color/colorPrimary"
    android:theme="@style/AppTheme.NavigationView"
    app:headerLayout="@layout/nav_header_drawer"
    app:menu="@menu/activity_drawer_drawer"/>

在你的 style.xml 文件中,你将添加这个主题

   <style name="AppTheme.NavigationView" >
    <item name="colorPrimary">@color/text_color_changed_onClick</item>
    <item name="android:textColorPrimary">@color/Your_default_text_color</item>
</style>

【讨论】:

【参考方案11】:

改变导航抽屉的文字颜色

我们使用 app:itemTextColor="@color/white"

改变导航抽屉的incon颜色

使用 app:itemIconTint="@color/black"


    <com.google.android.material.navigation.NavigationView
        android:id="@+id/naView"
        app:itemIconTint="@color/black"
        android:layout_
        app:menu="@menu/navmenu"
        app:itemTextColor="@color/white"
        app:headerLayout="@layout/nav_header"
        android:layout_
        app:itemTextAppearance="?android:textAppearanceMedium"
        android:fitsSystemWindows="true"
        android:layout_gravity="start"
        />

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

就我而言,我只需要更改一个菜单项的颜色 - “注销”。我不得不运行递归并更改标题颜色:

NavigationView nvDrawer;
Menu menu = nvDrawer.getMenu();
    for (int i = 0; i < menu.size(); i ++)
        MenuItem menuItem = menu.getItem(i);
        
        if (menuItem.getTitle().equals("Logout"))
            
            SpannableString spanString = new SpannableString(menuItem.getTitle().toString());
            spanString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(this, R.color.colorGreen)), 0, spanString.length(), 0);
            menuItem.setTitle(spanString);

        

    

我是在 Activity 的 onCreate 方法中完成的。

【讨论】:

为什么不直接通过 ID 查找商品? @AhmedAwadallah 你说得对,不需要遍历所有项目【参考方案14】:

这可能对我有用它对我有用

转到activity_“导航活动名称”.xml 在 NavigationView 中插入此代码

app:itemTextColor="color of your choice"

【讨论】:

【参考方案15】:

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

<android.support.design.widget.NavigationView
        android:layout_
        android:layout_
        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>

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

【讨论】:

【参考方案16】:

要更改单个项目的单个文本颜色,请使用 SpannableString,如下所示:

NavigationView navDrawer;
Menu menu = navDrawer.getMenu();

SpannableString spannableString = new SpannableString("Menu item"));
        spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorPrimary)), 0, spannableString.length(), 0);

menu.findItem(R.id.nav_item).setTitle(spannableString);

【讨论】:

【参考方案17】:
 <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_
        android:layout_
        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:
                android:color="#CACACA" />
        </shape>
    </item>
</layer-list>

【讨论】:

【参考方案18】:

itemIconTint,如果你想改变图标颜色

android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_
            android:layout_
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:itemTextColor="@color/colorPrimary"
            app:itemIconTint="@color/colorPrimary"
            app:headerLayout="@layout/nav_header_main"
            app:menu="@menu/activity_main_drawer" />

【讨论】:

以上是关于更改导航抽屉中菜单项的文本颜色的主要内容,如果未能解决你的问题,请参考以下文章

更改 navigationView 的单个特定菜单项的背景颜色

Android中的导航抽屉菜单项标题颜色

如何在 Android 中更改菜单项的文本颜色?

如何进行活动菜单文本颜色更改导航下拉项子菜单? [复制]

如何在导航抽屉中显示菜单类别的菜单图标?

更改 Blazor 菜单中导航项的可见性