【问题标题】:Changing color of back arrow icon of toolbar dynamically when using Navigation Component使用导航组件时动态更改工具栏后退箭头图标的颜色
【发布时间】:2023-02-19 05:16:28
【问题描述】:

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

如果还没有片段被膨胀,下一个代码只能改变导航图标按钮的颜色

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))

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

我的应用程序只能根据当前片段具有不同的工具栏样式(透明或纯色)。这就是为什么我想动态更改图标颜色

【问题讨论】:

    标签: android android-toolbar android-architecture-navigation android-navigation


    【解决方案1】:

    这对我有用

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

    首先从您的活动中创建一个 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()
    

    等瞧!

    【讨论】:

    • 不,谢谢,看起来像一个错误的代码。同样在这里你设置一个特定的导航图标,但它可以是箭头或菜单图标(如果你有抽屉)并且导航组件会自动设置这个图标,你不必手动设置
    • 您是否尝试过此代码并发现在导航抽屉的情况下它不适用于菜单图标?如果菜单图标是指导航抽屉的汉堡图标,则它可以正常工作,除非您有更多详细信息说明这是一个错误的代码并且违反了 NavComponent 规则。谢谢
    【解决方案2】:

    对于正在阅读本文并寻找答案的任何人。 只需将此添加到您的应用程序主题

    <item name="colorControlNormal">@color/your_color</item>
    

    【讨论】:

      猜你喜欢
      • 2016-04-07
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2019-04-19
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多