当前位置: 首页 > 知识库问答 >
问题:

底部导航视图图标更改不起作用

孟宏才
2023-03-14

我想在切换项目时切换到底部导航视图的图标。

我有浅蓝色图标和深蓝色图标的选定项目。我正在为每个导航项目使用选择器drawable,但我看到下面这样的图像,灰色为非活动图像,蓝色为活动图像

这是我的代码

bottom_nav_menu

    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/home_icon_selector"
        android:title="@string/title_home" />

    <item
        android:id="@+id/navigation_scheduler"
        android:icon="@drawable/schelduler_icon_selector"
        android:title="@string/title_scheduler" />

    <item
        android:id="@+id/navigation_favourites"
        android:icon="@drawable/favourites_icon_selector"
        android:title="@string/title_favourites" />


    <item
        android:id="@+id/navigation_settings"
        android:icon="@drawable/settings_icon_selector"
        android:title="@string/title_settings" />
</menu>

    <com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/nav_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="@dimen/margin_20"
    android:layout_marginLeft="@dimen/margin_20"
    android:layout_marginRight="@dimen/margin_20"
    android:layout_marginEnd="@dimen/margin_20"
    android:layout_marginBottom="@dimen/margin_8"
    android:background="@drawable/bottom_navigation_background"
    android:elevation="8dp"
    app:itemIconTint="@drawable/bottom_navigation_color_selector"
    app:labelVisibilityMode="unlabeled"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/bottom_nav_menu" />

和选择器

计划程序选择器

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

设置选择器

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

收藏夹选择器

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

首页选择器

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

活动代码

    val navView: BottomNavigationView = findViewById(R.id.nav_view)
    val navController = findNavController(R.id.nav_host_fragment)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    val appBarConfiguration = AppBarConfiguration(setOf(
            R.id.navigation_home, R.id.navigation_scheduler, R.id.navigation_favourites, R.id.navigation_settings))
    //  setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)

我做错了什么?请帮助。。。

编辑:我正在使用以下绘图工具

在此处输入链接描述

在此处输入链接描述

共有3个答案

拓拔阎宝
2023-03-14

您可以使用@Chris所说的选择器来实现这一点,或者您可以使用setOnNavigationItemSelectedListener{}动态执行此操作

更新-对于更改图标,您可以通过更改当前的项来强制执行。图标要填充图标,其他图标要未填充图标,请参见此处以获取其要点(不要将其复制到tabLayout)。

navView.setOnNavigationItemSelectedListener { item -> 
            // change  the icon to filled icon
            true
        }

listner似乎已贬值,请参考此

姜智渊
2023-03-14

这只是一个粗略的猜测,但这里可能有这样一句话:

app:itemIconTint="@drawable/bottom_navigation_color_selector"

是否影响了您的拖鞋颜色?如果您的抽绳具有正确的颜色(浅蓝色/深蓝色),则应与当前的选择器配合使用。

或者,检查您没有以其他方式为底部导航设置app: itemIconTint,例如通过主题或以编程方式!

韦业
2023-03-14

此问题的原因是app: itemIconTint总是有一个值,即使不使用它,它也采用原色/重音颜色的默认值。

因此,要解决您的问题,您需要明确禁用它:

val btmNav = findViewById<BottomNavigationView>(R.id.nav_view)
navView.itemIconTintList = null

虽然我确实推荐了另一件事:

图标已经是处于选中/未选中状态的相同图标,但具有不同的色调。如果这些图标是矢量,那么您可以使用app: itemIconTint中的选择器着色,并使用单个版本的图标,而无需复制资源:

icon\u color\u选择器。xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#2596CD" android:state_checked="true" />
    <item android:color="#84D0F4" android:state_checked="false" />
</selector>

并应用:

<com.google.android.material.bottomnavigation.BottomNavigationView
    ...
    app:itemIconTint="@drawable/icon_color_selector"

并仅保留带有图标的菜单项,而不保留选择器,例如:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/home_icon"  //<<<<< icon not selector
        android:title="@string/title_home" />

    ....

</menu>

更新:

在使用导航体系结构组件时,请确保在底部导航视图(bottomNavView)菜单中具有与底部导航视图(bottomNavView)片段的导航图(navGraph)中对应的ID相同的ID。

如果您不使用navGraph作为BotomNavView片段,那么您就不能使用navView.setupNevNavController(navController)

这是您的可绘制图标

 类似资料:
  • 我在我的应用程序中添加了。 主要的xml bottom\u navigation\u main。xml 主活动单击 我想更改所选位置底部导航的图标。当用户单击一个项目时,我们如何实现此功能? (如果用户单击了一个项目,则图标将更改为另一个项目)

  • 我的应用程序有问题。我有一个底部导航视图,包含3个不同的片段,尽管目前只有主要的内容。当我试图从左侧的两个片段中的一个移动到主视图时,问题就出现了,即当底部导航视图被隐藏时。我附上了主代码。 PD:我有25.3.1版本的所有库(如果有用的话)。 感谢您的关注。 activity\u main。xml 主要活动。Java语言 我也给你添加了两张图片。 Ofertas片段 主片段

  • 但是,当我初始化BottomNavigationView时,我会得到: 我正在从一个片段初始化BottomNativigationView。我猜这就是问题所在,但我想不出解决办法。 下面是为片段设置导航的活动的BottomNavigationView xml。

  • 我在我的项目中实现了Design Support Library 25中的底部导航视图。我在视图中有5个图标。每当选择一个图标时,它都会有一些动画。但当3个或更少的图标未显示任何动画时。我想删除该动画,只需要对图标进行一些颜色更改。我怎样才能做到这一点?做了足够多的谷歌搜索,但找不到解决方案。请帮忙。谢谢

  • 我正在android中测试Navigation Drawer示例项目,在设置Navigation view配置文件标题中的文本时遇到问题。 这是我的代码: 主要活动。JAVA 主要活动。xml 导航总管总管。xml 当我试图设置textview的文本时,我总是会遇到这个错误,而且只有在api级别23时才会发生: 如何从主活动更改nav_header_main.xml的Textview文本? 提前谢