动态更改Android导航视图项目颜色

16
我想创建一个导航抽屉,其中每个项目都具有不同的选择颜色(图标色调和文本颜色),就像Google Play商店一样: 进入图像描述 我不确定他们是如何解决这个问题的,但我认为他们使用具有不同抽屉的不同活动。我想使用片段并更改图标色调和文本颜色。您有什么想法如何实现这一点吗?我正在使用Google的设计支持库以及其中的抽屉布局和导航视图。

1
可能他们没有使用NavigationView,因为这是在设计支持库之前的应用程序中(如果我没记错的话)。我认为你需要自己重新创建视图来实现这个效果。 - Longi
@tom。你有解决方案吗?你似乎已经接受了答案,但对我来说它不起作用。 - Parth Anjaria
6个回答

38

在您的NavigationView中使用app:itemIconTint来设置图标颜色,使用app:itemTextColor来设置文本颜色。

示例:

drawable/navigation_text_color

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- This is used when the Navigation Item is checked -->
    <item android:color="#009688" android:state_checked="true" />
    <!-- This is the default text color -->
    <item android:color="#E91E63" />
</selector>

以及 布局

<android.support.design.widget.NavigationView
       .
       .
       app:itemTextColor="@drawable/navigation_text_color"/>

谢谢,现在每次菜单项被点击时我都会更改ColorStateList。 - vigonotion
你会把这个选择器 XML 代码片段放在哪里?另外,app:itemTextColor 会改变所有图标的颜色。有没有办法只改变一个图标的颜色?谢谢! - justinrixx
1
@justinrixx 我正在使用以下 Java 代码,在每次选择项目时对其进行更改:https://jsfiddle.net/a2j7jayo/ - vigonotion
1
@justinrixx 不,根据Material Design的概念,在导航视图中,所有图标必须是单色的。 - DJafari
@D.A.V.O.O.D,所以你不使用收件箱作为示例吗?即使它们不是“已选中”的图标,有些图标的颜色也是不同的。我认为这就是justinrixx想要实现的(我也是)。 - Mino
显示剩余5条评论

7
如果您所说的 “动态” 意味着 “通过编程”,那么您可以尝试以下方法:
// FOR NAVIGATION VIEW ITEM TEXT COLOR
int[][] states = new int[][]{
        new int[]{-android.R.attr.state_checked},  // unchecked
        new int[]{android.R.attr.state_checked},   // checked
        new int[]{}                                // default
};

// Fill in color corresponding to state defined in state
int[] colors = new int[]{
        Color.parseColor("#747474"),
        Color.parseColor("#007f42"),
        Color.parseColor("#747474"),
};

ColorStateList navigationViewColorStateList = new ColorStateList(states, colors);

// apply to text color
navigationView.setItemTextColor(navigationViewColorStateList);

// apply to icon color
navigationView.setItemIconTintList(navigationViewColorStateList);

因此,您可以为不同的设置(如白天或黑夜)定义多种颜色。


1
您可以使用以下代码以编程方式实现此操作: MenuItemCompat.setIconTintMode(item, PorterDuff.Mode.DST) 其中,item 是您不需要色调的菜单项。

1
这是完美的解决方案!请点赞,因为这不应该在底部出现! - Boy
但是这需要至少API级别>= 26。 - Ajay
@Ajay 不是的。这在我API 21+的项目中可以运行。 - Artem Mostyaev

0

终于我找到了答案,

你必须在颜色文件中更改colorAccent为你想要的任何颜色:

  <color name="colorAccent">whichever color required</color>

这个解决方案对我很有效


0

对于那些懒惰的人来说,有一个更简单的选择。

TL;DR:只需创建一个新的style,其中colorPrimary是您想要的颜色,然后将NavigationViewtheme设置为这个新的style

只需创建一个新的style

<style name="AppTheme.NoActionBar.NavigationView">
    <item name="colorPrimary">@color/myDesiredColor</item>
</style>

这个 style 会自动继承你的基础 theme(在我的情况下是 AppTheme.NoActionBar),然后你只需要设置 colorPrimary 为你想要的颜色。

然后你只需要将 NavigationViewtheme 设置为:

android:theme="@style/AppTheme.NoActionBar.NavigationView"

输入:

<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:headerLayout="@layout/nav_header_menu_test"
    app:menu="@menu/main_drawer"
    android:theme="@style/AppTheme.NoActionBar.NavigationView" /> 

0
    <android.support.design.widget.NavigationView
           .
           .
           app:itemIconTint="@color/your_selector_file_name" // for Icon
        app:itemTextColor="@color/your_selector_file_name" // for text
/>

补充一下 @DAVOOD 说的。以下颜色选择器对我有用。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- This is used when the Navigation Item is checked -->
        <item android:color="@color/tenoBrandColor" android:state_pressed="true" />
        <!-- This is the default text color -->
        <item android:color="@color/textprimary" />
</selector>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接