使用Navigation Component动态修改Toolbar返回箭头颜色问题
问题核心
用Navigation Component管理单Activity多Fragment时,NavigationUI会自动替换Toolbar的导航图标(汉堡/返回箭头),这会直接覆盖你调用setNavigationIconTint()设置的颜色,导致切换Fragment后图标颜色失效。
解决方案
不要直接调用Toolbar.setNavigationIconTint(),而是获取当前Toolbar的导航图标Drawable,直接给它设置tint。因为每次导航切换时NavigationUI都会替换图标,所以要在导航目的地变化时重新设置一次tint,无需额外判断图标类型。
代码实现
- 在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
相关产品推荐
相关产品推荐

