更改 BottomNavigationView 单项图标和文本颜色

问题描述

我有一个底部导航视图:

<com.google.android.material.bottomnavigation.BottomNavigationView
        ...
        app:itemIconTint="@drawable/bottom_nav_menu_color_selector"
        app:itemTextColor="@drawable/bottom_nav_menu_color_selector"
        app:labelVisibilityMode="labeled"
        app:menu="@menu/bottom_nav_menu" />
            

使用 itemIconTintitemTextColor 选择器:

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

菜单

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/bottomNavFirst"
        android:icon="@drawable/bottom_nav_first_selector"
        android:title="@string/bottom_nav_first_title" />

    <item
        android:id="@+id/bottomNavSecond
        android:icon="@drawable/bottom_nav_second_selector"
        android:title="@string/bottom_nav_second_title" />

</menu>

菜单项图标的选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bottom_nav_first_icon_selected" android:state_checked="true" />
    <item android:drawable="@drawable/bottom_nav_first_icon_deselected" android:state_checked="false" />
</selector>

现在根据应用程序状态,我需要更改一个菜单项图标颜色和标题颜色。选择和取消选择时它应该是灰色的。我尝试了 setTintListsetTint 方法但没有成功:

bottomNavView.menu.findItem(R.id.bottomNavFirst)?.icon?.setTintList(null)
bottomNavView.menu.findItem(R.id.bottomNavFirst)?.icon?.setTint(Color.GRAY)

iconTintList 这样的属性不是一个选项,因为我的 API 级别是 21。任何想法如何实现?

解决方法

试试这个来改变标题颜色:

    SpannableString titleSpannable = new  SpannableString("title");

    titleSpannable.setSpan(
            new ForegroundColorSpan(Color.RED),titleSpannable.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

bottomNavView.getMenu().findItem(R.id.bottomNavFirst).setTitle(titleSpannable);

我正在寻找如何只更改一个图标。