使用导航组件时动态更改工具栏的后退箭头图标的颜色



所以我有一个活动应用程序,在活动布局中放置了一个工具栏。

下一个代码只适用于在没有碎片的情况下更改导航图标按钮的颜色

binding.toolbar.setNavigationIconTint(ContextCompat.getColor(this, R.color.white))

但一旦导航组件用箭头返回按钮打开任何片段(如果它可以返回到上一个片段(,则返回按钮的箭头图标的颜色就会不同(它是黑色的(

即使是以下代码也无助于更改后退按钮箭头图标的颜色:

override fun onDestinationChanged(
controller: NavController,
destination: NavDestination,
arguments: Bundle?
) {
binding.toolbar.setNavigationIconTint(ContextCompat.getColor(this, R.color.white))
}

它仍然是黑箭头

为什么在使用带有NavigationComponent的片段时无法更改它,以及为什么它设置为某种背景色(默认颜色或其他颜色(?

导航图标由NavigationComponent设置。如果当前片段是为AppBarConfiguration(fragments)设置的片段之一,则可以是箭头返回,也可以是菜单(汉堡包(图标

当我在onDestinationChanged中这样设置它时,它会被更改,但在这里我手动设置图标和颜色,如果我应该设置箭头或菜单图标,我必须添加逻辑,所以它使一切都变得复杂,而且是样板代码,因为NavigationCompopnent可以自己处理:

binding.toolbar.setNavigationIcon(R.drawable.ic_arrow) // or menu (need to add logic which icon should be used)
binding.toolbar.setNavigationIconTint(ContextCompat.getColor(this, R.color.white))

我只想改变导航图标的颜色,而不是图标本身。

我的应用程序可以根据当前片段有不同的工具栏样式(透明或实心(。这就是为什么我想动态改变图标颜色

这对我有效

要以编程方式有效地设置导航图标的色调,您需要先设置可绘制内容,然后再应用色调。

首先从你的活动创建一个doJob方法

fun doJob() {
binding.toolbar.title = "Reached"
binding.toolbar.setNavigationIcon(R.drawable.ic_baseline_arrow_back_24)
binding.toolbar.children.forEach {
(it as? AppCompatImageButton)?.imageTintList =
ColorStateList.valueOf(Color.GREEN)
it.refreshDrawableState()
}
}

然后在您的片段上,一旦调用onViewCreated((,您就可以调用活动的doJob方法

片段内

((requireActivity()) as MainActivity).doJob()

瞧!

对于任何正在阅读并搜索答案的人。只需将其添加到xml 中的自定义工具栏即可

android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"

最新更新