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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:30:53