更改导航抽屉项目颜色过滤器也更改使用相同图像 id 的 imageView
Change Navigation drawer item color filter also change the imageView which is use same image id
在应用程序中,导航抽屉包含很多菜单项。限制是,有一个项目将显示其色调颜色的颜色实例,而另一个项目将显示色调。有了这个限制,我决定使用滤色器来处理项目抽屉的图标颜色阶段。这条路工作得很好。
我的菜单是这样的。
<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 中添加色调颜色以更改为不同的细颜色,但它仍然显示菜单的相同颜色。例如。
<ImageView
android:tint="@color/black"
android:src="@drawable/ic_settings_black_24dp" />
在这种情况下,imageView 应该只显示黑色。但是根据菜单显示灰色或蓝色。
预期的结果是 imageView 应该根据我在 XML
中设置的颜色着色
但结果是它显示了与菜单项相同的色调。
我独立思考,有人可以解释为什么会发生这个问题以及如何解决它
在项目中使用数据绑定和Kotlin
我从您的问题中了解到,您需要将菜单项和 imageView 的选定项的颜色更改为蓝色,将未选定项的颜色更改为灰色。您可以使用 colorstatelist 来执行此操作,而不是编写自己的逻辑来更改色调。
按照此 link 了解想法.. https://developer.android.com/guide/topics/resources/color-list-resource.html
总的来说,解决方案可能是……
创建颜色状态列表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>
将此背景应用到您需要在屏幕上显示的视图。
<ImageView android:background='@drawable/selection_state
...../>
在此之后,如果视图自动进入选定状态,则应用此状态列表的所有视图的颜色都会更改。
感谢大家对我的帮助。我终于找到答案了。
首先 menu.getItem(i)?.icon?
是 return 可绘制的。当在这个可绘制对象中使用固定的东西时,可绘制对象被缓存,尽管当我尝试使用相同的图像 ID 时,它 return 将我缓存可绘制对象。为了修复它,只需调用方法 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!!
}
}
}
在应用程序中,导航抽屉包含很多菜单项。限制是,有一个项目将显示其色调颜色的颜色实例,而另一个项目将显示色调。有了这个限制,我决定使用滤色器来处理项目抽屉的图标颜色阶段。这条路工作得很好。
我的菜单是这样的。
<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 中添加色调颜色以更改为不同的细颜色,但它仍然显示菜单的相同颜色。例如。
<ImageView
android:tint="@color/black"
android:src="@drawable/ic_settings_black_24dp" />
在这种情况下,imageView 应该只显示黑色。但是根据菜单显示灰色或蓝色。
预期的结果是 imageView 应该根据我在 XML
中设置的颜色着色但结果是它显示了与菜单项相同的色调。
我独立思考,有人可以解释为什么会发生这个问题以及如何解决它 在项目中使用数据绑定和Kotlin
我从您的问题中了解到,您需要将菜单项和 imageView 的选定项的颜色更改为蓝色,将未选定项的颜色更改为灰色。您可以使用 colorstatelist 来执行此操作,而不是编写自己的逻辑来更改色调。
按照此 link 了解想法.. https://developer.android.com/guide/topics/resources/color-list-resource.html
总的来说,解决方案可能是……
创建颜色状态列表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>
将此背景应用到您需要在屏幕上显示的视图。
<ImageView android:background='@drawable/selection_state ...../>
在此之后,如果视图自动进入选定状态,则应用此状态列表的所有视图的颜色都会更改。
感谢大家对我的帮助。我终于找到答案了。
首先 menu.getItem(i)?.icon?
是 return 可绘制的。当在这个可绘制对象中使用固定的东西时,可绘制对象被缓存,尽管当我尝试使用相同的图像 ID 时,它 return 将我缓存可绘制对象。为了修复它,只需调用方法 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!!
}
}
}