Android Material 3主题下修改返回按钮图标颜色的方法
问题描述
我开发了一个单Activity应用,主题继承自Theme.Material3.DayNight。该Activity没有自定义Toolbar,配有Bottom Navigation,使用Jetpack Navigation库实现Fragment间导航。
导航到非底部导航对应的Fragment时,工具栏会出现返回箭头,点击可返回上一个Fragment,这符合预期,但我始终无法修改该箭头图标的颜色。
我尝试从Activity中获取supportActionBar并查找对应的视图,但未成功;也使用过布局检查器,但它仅显示工具栏下方的视图。
相关代码
Main Activity样式
<style name="Theme.MyTheme" parent="Theme.Material3.DayNight"> ... </style>
Main Activity布局
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".presentation.MainActivity"> <androidx.fragment.app.FragmentContainerView android:id="@+id/fragment_container_view" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="0dp" app:defaultNavHost="true" app:layout_constraintBottom_toTopOf="@+id/nav_view" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:navGraph="@navigation/nav_graph" /> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/nav_view" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="0dp" android:layout_marginEnd="0dp" app:itemActiveIndicatorStyle="@style/Honk.Custom.Indicator" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:menu="@menu/bottom_nav_menu" /> </androidx.constraintlayout.widget.ConstraintLayout>
Main Activity初始化代码
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setupMainScreen() } private fun setupMainScreen() { binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val navView: BottomNavigationView = binding.navView val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container_view) val navController = (fragment as NavHostFragment).navController val appBarConfiguration = AppBarConfiguration( setOf(R.id.navigation_clients, R.id.navigation_vehicles, R.id.navigation_settings) ) setupActionBarWithNavController(navController, appBarConfiguration) findViewById<Toolbar>(androidx.appcompat.R.id.action_bar) navView.setupWithNavController(navController) } override fun onSupportNavigateUp(): Boolean { val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container_view) val navController = (fragment as NavHostFragment).navController return navController.navigateUp() || super.onSupportNavigateUp() }
解决方案
方法1:通过主题属性直接修改(推荐)
在你的Theme.MyTheme中添加Material3专属的返回箭头颜色属性,全局生效:
<style name="Theme.MyTheme" parent="Theme.Material3.DayNight"> <!-- 修改返回箭头颜色 --> <item name="toolbarNavigationIconColor">@color/your_desired_color</item> <!-- 适配深色模式可单独设置夜间颜色 --> <item name="toolbarNavigationIconColorNight">@color/your_night_mode_color</item> </style>
如果上述属性不生效,可尝试全局图标色调属性:
<style name="Theme.MyTheme" parent="Theme.Material3.DayNight"> <item name="actionBarIconColor">@color/your_desired_color</item> </style>
方法2:自定义Toolbar并绑定Navigation
若主题属性修改无效,可添加自定义Toolbar到布局,手动控制样式:
- 修改Activity布局,插入Toolbar:
<androidx.constraintlayout.widget.ConstraintLayout ...> <androidx.appcompat.widget.Toolbar android:id="@+id/custom_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_constraintTop_toTopOf="parent" /> <androidx.fragment.app.FragmentContainerView android:id="@+id/fragment_container_view" ... app:layout_constraintTop_toBottomOf="@+id/custom_toolbar" /> <!-- BottomNavigationView 保持不变 --> </androidx.constraintlayout.widget.ConstraintLayout>
- 在Activity中绑定Toolbar与Navigation,并修改箭头颜色:
private fun setupMainScreen() { binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val navView: BottomNavigationView = binding.navView val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container_view) val navController = (fragment as NavHostFragment).navController // 设置自定义Toolbar为ActionBar val toolbar = binding.customToolbar setSupportActionBar(toolbar) val appBarConfiguration = AppBarConfiguration( setOf(R.id.navigation_clients, R.id.navigation_vehicles, R.id.navigation_settings) ) // 绑定Navigation控制器 toolbar.setupWithNavController(navController, appBarConfiguration) // 修改返回箭头颜色 toolbar.navigationIcon?.setTint(ContextCompat.getColor(this, R.color.your_desired_color)) navView.setupWithNavController(navController) }
方法3:通过导航监听器动态修改
如果需要根据不同Fragment切换箭头颜色,可添加导航监听:
private fun setupMainScreen() { // ... 其他初始化代码 navController.addOnDestinationChangedListener { _, destination, _ -> supportActionBar?.let { actionBar -> val drawable = actionBar.homeAsUpIndicator drawable?.let { val color = when (destination.id) { R.id.target_fragment_1 -> ContextCompat.getColor(this, R.color.red) R.id.target_fragment_2 -> ContextCompat.getColor(this, R.color.blue) else -> ContextCompat.getColor(this, R.color.default_color) } it.setTint(color) actionBar.setHomeAsUpIndicator(it) } } } }
布局检查器使用技巧
系统默认ActionBar属于DecorView层级,之前看不到是因为没展开顶层结构。在布局检查器中依次展开:DecorView -> LinearLayout -> ActionBarContainer -> Toolbar,就能找到返回箭头对应的AppCompatImageView,可查看它的当前属性排查问题。
内容的提问来源于stack exchange,提问作者Leonardo Sibela
相关产品推荐
相关产品推荐

