0

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

我的菜单看起来像这样。

    <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" />

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

已选择:蓝色

未选择:灰色

主菜单

selected:显示其颜色

未选择:灰色

处理状态的代码如下所示

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 中添加 tint color 以更改为不同的淡色,但它仍然显示菜单的相同颜色。例如。

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

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

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

但结果是它显示了与菜单项相同的色调。

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

4

2 回答 2

0

我从您的问题中可以理解的是,您需要将菜单项和 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 ...../>

此后,如果视图自动进入选定状态,则应用此状态列表的所有视图的颜色都将更改。

于 2017-06-27T04:55:30.057 回答
0

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

首先menu.getItem(i)?.icon?是返回drawable。当在这个drawable中使用固定的东西时,drawable被缓存,尽管当我尝试使用相同的图像ID时,它返回给我缓存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!!
     }
  }
}
于 2017-06-27T06:45:05.140 回答