如何修改Toolbar上打开导航抽屉的切换图标颜色
问题根源
之前的配置不生效是三个核心问题导致的:
- 主题中
drawerArrowStyle引用路径错误:你自定义了DrawerArrowStyle样式,但配置项里填的是系统默认的@style/Widget.AppCompat.DrawerArrowToggle,自定义的白色规则根本没有被加载。 - 主题配置冲突:同时设置
windowActionBar = true和windowNoTitle = true,使用自定义Toolbar时本身需要关闭系统默认ActionBar,否则导航图标样式加载逻辑会出现冲突。 - 布局结构错误+未绑定切换组件:你把Toolbar放在DrawerLayout外层,也没有在代码中初始化
ActionBarDrawerToggle关联两者,导航抽屉的切换按钮根本没有正确挂载到Toolbar上,着色规则自然找不到目标控件。
修复步骤
1. 修正themes.xml配置
替换原有主题配置,关闭系统ActionBar,正确引用自定义的抽屉箭头样式:
<resources xmlns:tools="http://schemas.android.com/tools"> <style name="Theme.WeNote" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 主色调配置 --> <item name="colorPrimary">#673AB7</item> <item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorOnPrimary">@color/teal_700</item> <!-- 次级色调配置 --> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_700</item> <item name="colorOnSecondary">@color/white</item> <!-- 状态栏颜色 --> <item name="android:statusBarColor" tools:targetApi="l">@color/black</item> <!-- 正确引用自定义抽屉箭头样式 --> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> </style> <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> <item name="color">@color/white</item> <!-- 可选配置:开关抽屉时箭头是否旋转、线条粗细 --> <item name="spinBars">true</item> <item name="thickness">2dp</item> </style> </resources>
注意:主题父类改用NoActionBar版本,删掉原有冲突的windowActionBar、windowNoTitle配置,避免系统默认ActionBar和自定义Toolbar冲突
2. 修正主布局层级
DrawerLayout必须作为根布局,Toolbar放在DrawerLayout的主内容子节点中,同时去掉DrawerLayout写死的211dp高度,改成match_parent:
<androidx.drawerlayout.widget.DrawerLayout 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/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" tools:openDrawer="start"> <!-- 主内容区 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/light_black" app:titleTextColor="@color/white" /> <!-- 这里放置页面其他业务内容 --> </LinearLayout> <!-- 侧边抽屉栏 --> <com.google.android.material.navigation.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/header_layout" app:menu="@menu/menu_layout" /> </androidx.drawerlayout.widget.DrawerLayout>
3. Activity中绑定切换组件
在MainActivity中添加关联逻辑,将DrawerLayout和Toolbar绑定,导航切换按钮才会正常显示并加载样式:
class MainActivity : AppCompatActivity() { private lateinit var drawerToggle: ActionBarDrawerToggle override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.你的主布局id) val toolbar = findViewById<Toolbar>(R.id.toolbar) val drawerLayout = findViewById<DrawerLayout>(R.id.drawer_layout) // 将自定义Toolbar设置为页面ActionBar setSupportActionBar(toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) // 初始化抽屉切换按钮 drawerToggle = ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.drawer_open, // 提前在strings.xml中定义抽屉开/关的无障碍描述文案 R.string.drawer_close ) drawerLayout.addDrawerListener(drawerToggle) drawerToggle.syncState() } override fun onOptionsItemSelected(item: MenuItem): Boolean { return if (drawerToggle.onOptionsItemSelected(item)) { true } else super.onOptionsItemSelected(item) } }
快速实现方案(无需修改全局主题)
如果不想调整全局主题配置,可以直接在代码中给切换按钮设置颜色:
// 方法1:直接给切换箭头drawable设置颜色 drawerToggle.drawerArrowDrawable.color = ContextCompat.getColor(this, R.color.white) // 方法2:给Toolbar导航图标设置着色滤镜 toolbar.navigationIcon?.setColorFilter( ContextCompat.getColor(this, R.color.white), PorterDuff.Mode.SRC_ATOP )
内容的提问来源于stack exchange,提问作者newbie-coder
相关产品推荐
相关产品推荐

