更改导航抽屉项目颜色过滤器也改变了使用相同的图像ID的imageView

在应用程序中有导航抽屉包含很多菜单项。 局限性是,有一个项目会显示其色调的颜色实例,而另一个则显示色调。 有了这个限制,我决定使用彩色滤镜来处理物品抽屉的图标颜色阶段。 这条路径工作得很好。

我的菜单看起来像这样

<item android:id="@+id/menu_main" android:icon="@drawable/ic_my_logo_24dp" android:title="@string/app_name" /> <item android:id="@+id/menu_setting" android:icon="@drawable/ic_settings_black_24dp" android:title="@string/text_menu_settings" /> <item android:id="@+id/menu_contact_us" android:icon="@drawable/ic_markunread_black_24dp" android:title="@string/text_menu_contact_us" /> <item android:id="@+id/menu_faq" android:icon="@drawable/ic_faq_black_24dp" android:title="@string/text_menu_faq" /> 

每个菜单期望主菜单应该像这样显示颜色状态

选中:蓝色

未选中:灰色

主菜单

选中:显示其颜色

未选中:灰色

处理状态的代码看起来像这样

 fun setSelectedMenuItemColor(selectedId: Int) { val menu = binding?.navView?.menu repeat(menu!!.size()) { i -> menu.getItem(i)?.icon?.colorFilter = when { menu.getItem(i).itemId == selectedId && selectedId == R.id.menu_main -> null menu.getItem(i).itemId == selectedId -> selectedFilterColor else -> idleFilterColor!! } } } 

问题是

如果我使用imageView并设置为与其中一个菜单项相同的drawable。 菜单项的颜色状态将会改变。 我不想改变imageView的色调。 但它根据菜单项而改变。 然后,我在图像添加色调颜色改变到不同的薄颜色,但它仍然显示相同的颜色的菜单。 例如。

 <ImageView android:tint="@color/black" android:src="@drawable/ic_settings_black_24dp" /> 

在这种情况下,imageView应该只显示黑色。 但根据菜单显示为灰色或蓝色。

期望的结果是imageView应该从我在XML中设置的颜色着色

但结果是它显示了像菜单项一样的色调颜色。

我认为这是独立的,有人可以解释为什么发生这个问题,以及如何解决在项目中使用数据绑定和Kotlin

我可以从你的问题中了解到,你需要改变选择的项目的颜色为蓝色和非选定的项目灰色的菜单项和imageView。 你可以使用colorstatelist来做到这一点,而不是写自己的逻辑来改变色调。

按照此链接得到的想法.. https://developer.android.com/guide/topics/resources/color-list-resource.html

总的来说,解决方案可能是像..

  1. 创建一个颜色状态列表xml文件“selection_state.xml”

    <selector> <item android:color='@color/your_preffered_color' android:state_selected='true'/> <item android:color='@color/your_preffered_color' android:state_selected='false'/> </selector>

  2. 将此背景应用于需要在屏幕上显示的视图。

    <ImageView android:background='@drawable/selection_state ...../>

在此之后,如果视图自动进入选定状态,那么对于应用此状态列表的所有视图,颜色将被更改。

感谢大家帮助我。 我终于找到答案。

首先menu.getItem(i)?.icon? 是可退货的。 而当在这个drawable中使用固定的东西时,尽管当我尝试使用相同的图像ID时,drawable仍然是缓存,它会返回我缓存的drawable。 为了解决它只是调用drawable.mutate()方法来防止可绘制的缓存。 最终的代码应该是这样的。

 fun setSelectedMenuItemColor(selectedId: Int) { val menu = binding?.navView?.menu repeat(menu!!.size()) { i -> menu.getItem(i)?.icon?.mutate() menu.getItem(i)?.icon?.colorFilter = when { menu.getItem(i).itemId == selectedId && selectedId == R.id.menu_main -> null menu.getItem(i).itemId == selectedId -> selectedFilterColor else -> idleFilterColor!! } } }