如何在BottomNavigationView中显示没有色调的菜单项图标

God*_*win 8 android menu menu-items bottomnavigationview

我创建了一个BottomNavigationView包含三个项目。其中之一是用户选项卡

底部

对于访客选项卡,有一个图像,但 TintColor 正在应用,我们看不到它。

那么如何去除特定项目的色调?

我试过了

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                            item.setIconTintList(null);

                        }
Run Code Online (Sandbox Code Playgroud)

但没有运气。它适用于 api 26 以上

我的活动

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottomNavigationView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:itemIconTint="@drawable/bottom_color_state"
    app:itemBackground="@color/colorAccent"
    app:itemTextColor="@drawable/bottom_color_state"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:menu="@menu/menu_bottom_navigation" />
Run Code Online (Sandbox Code Playgroud)

底部颜色状态.xml

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:color="@color/white" android:state_enabled="true" />
        <item android:color="@color/colorPrimaryDark" android:state_enabled="false" />
        <item android:color="@color/white" android:state_selected="true" />
        <item android:color="@color/off_white" android:state_selected="false" />
        <item android:color="@color/white" android:state_checked="true" />
        <item android:color="@color/off_white" android:state_checked="false" />
        <item android:color="@color/off_white" />
    </selector>
Run Code Online (Sandbox Code Playgroud)

提前致谢

Sky*_*ile 21

似乎无法仅更改一个菜单项的色调,因为 BottomNavigationView 将色调应用到包装器 drawable 中的列表中的每个项目。您需要从导航视图中删除色调列表,并分别在每个菜单项图标上设置色调列表。

navView.itemIconTintList = null

然后在要着色的每个菜单项图标中,在矢量可绘制对象上设置颜色状态列表。

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="@color/bottom_color_state"
        android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"/>
</vector>
Run Code Online (Sandbox Code Playgroud)

我早在 API 21 时就测试了该解决方案。 使用底部导航模板和用户图标实现的屏幕示例。


小智 7

我知道这个线程相当古老,但也许答案可以帮助一些偶然发现该线程的人。

我们遇到了同样的问题(使用 NavigationView 而不是 BottomNavigationView),并且由于某种原因 Skytile 的解决方案对我们不起作用。

正如 Skytile 指出的那样,不可能(至少在 API 级别 < 26 上)为单个项目设置自定义色调列表。但是,可以设置色调模式:

val itemsWithoutTint: List<Int> = listOf(12345)
for (i in 0 until getMenu().size()) {
    val item = getMenu().getItem(i)
    if (item.itemId in itemsWithoutTint) {
        MenuItemCompat.setIconTintMode(item, PorterDuff.Mode.DST)
    }
}
Run Code Online (Sandbox Code Playgroud)

通过将 TintMode 设置为 DST ( https://developer.android.com/reference/android/graphics/PorterDuff.Mode ),源(在本例中为色调颜色)将被忽略,目标(要着色的图标)将被忽略保持原样。


Che*_*ake -1

在资源中添加颜色资源文件夹并将bottom_color_state放入该文件夹中并替换bottom_color_state代码如下

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:color="@color/white" />
    <item android:state_checked="false" android:color="@color/colorPrimaryDark"/>
</selector>
Run Code Online (Sandbox Code Playgroud)