You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Navigation Component动态修改Toolbar返回箭头颜色问题

解决Navigation Component控制下Toolbar导航图标颜色不更新的问题

问题核心

用Navigation Component管理单Activity多Fragment时,NavigationUI会自动替换Toolbar的导航图标(汉堡/返回箭头),这会直接覆盖你调用setNavigationIconTint()设置的颜色,导致切换Fragment后图标颜色失效。

解决方案

不要直接调用Toolbar.setNavigationIconTint(),而是获取当前Toolbar的导航图标Drawable,直接给它设置tint。因为每次导航切换时NavigationUI都会替换图标,所以要在导航目的地变化时重新设置一次tint,无需额外判断图标类型。

代码实现

  1. 在Activity中监听导航目的地变化,根据当前Fragment动态更新图标颜色:
class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedListener {
    private lateinit var binding: ActivityMainBinding
    private lateinit var navController: NavController
    private lateinit var appBarConfiguration: AppBarConfiguration

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        navController = findNavController(R.id.nav_host_fragment)
        appBarConfiguration = AppBarConfiguration(setOf(R.id.homeFragment))
        NavigationUI.setupWithNavController(binding.toolbar, navController, appBarConfiguration)

        // 注册导航目的地监听
        navController.addOnDestinationChangedListener(this)
        // 初始化时设置初始颜色
        updateNavIconTint(navController.currentDestination)
    }

    override fun onDestinationChanged(
        controller: NavController,
        destination: NavDestination,
        arguments: Bundle?
    ) {
        updateNavIconTint(destination)
    }

    private fun updateNavIconTint(destination: NavDestination?) {
        // 根据当前Fragment判断Toolbar样式,返回对应tint颜色
        val tintColor = when (destination?.id) {
            R.id.homeFragment -> ContextCompat.getColor(this, R.color.white) // 透明Toolbar用白色图标
            R.id.detailFragment -> ContextCompat.getColor(this, R.color.black) // 纯色Toolbar用黑色图标
            // 其他Fragment按需添加判断
            else -> ContextCompat.getColor(this, R.color.white)
        }
        // 给当前显示的导航图标设置颜色
        binding.toolbar.navigationIcon?.setTint(tintColor)
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }
}

原理说明

  • NavigationUI切换导航图标时,会替换Toolbar的navigationIcon实例,之前通过setNavigationIconTint()设置的全局tint不会自动应用到新的Drawable上。
  • 直接获取当前的navigationIcon并调用setTint(),是针对当前显示的图标实例设置颜色,每次图标替换后重新执行即可生效。
  • 这种方式无需判断图标是汉堡还是返回箭头,只需要根据Fragment目的地控制颜色,避免了冗余逻辑。

内容的提问来源于stack exchange,提问作者user924

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:24:16