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

Navigation Drawer汉堡菜单图标无法修改问题求助

问题:Navigation Components无法修改汉堡菜单默认图标

使用Navigation Components开发时,尝试通过supportActionBar?.setHomeAsUpIndicator()修改汉堡菜单图标,但始终显示默认图标。

尝试的代码(Home_Activity.kt):

val navHostFragment =
    supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController

setSupportActionBar(binding.newToolbar)

supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setHomeAsUpIndicator(R.drawable.notification)

notification = findViewById(R.id.notification)

布局代码(activity_home.xml):

<androidx.appcompat.widget.Toolbar
    android:id="@+id/new_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="#8049422E"
    android:backgroundTint="#8049422E"
    app:layout_constraintTop_toTopOf="parent"
    app:navigationIcon="@null"
    app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/chat"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginEnd="18dp"
            android:src="@drawable/ic_chat_main"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/notification"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:id="@+id/notification"
            android:layout_width="22dp"
            android:layout_height="22dp"
            android:layout_marginEnd="18dp"
            android:src="@drawable/notification"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/white"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.appcompat.widget.Toolbar>

解决方案

问题根源:Navigation Components的NavigationUI会自动根据当前导航目的地更新ActionBar图标,直接调用supportActionBar的设置会被覆盖。需要通过自定义ActionBarDrawerToggle或监听导航目的地变化来实现自定义图标。

方案1:自定义ActionBarDrawerToggle(适用于带DrawerLayout的场景)

如果页面使用了DrawerLayout,通过自定义ActionBarDrawerToggle替换默认图标:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
val drawerLayout = binding.drawerLayout // 替换为你布局中DrawerLayout的实际ID

setSupportActionBar(binding.newToolbar)

// 创建自定义DrawerToggle
val toggle = object : ActionBarDrawerToggle(
    this,
    drawerLayout,
    binding.newToolbar,
    R.string.navigation_drawer_open,
    R.string.navigation_drawer_close
) {
    override fun onDrawerClosed(drawerView: View) {
        super.onDrawerClosed(drawerView)
        invalidateOptionsMenu()
    }

    override fun onDrawerOpened(drawerView: View) {
        super.onDrawerOpened(drawerView)
        invalidateOptionsMenu()
    }
}

// 设置自定义图标并禁用默认汉堡指示器
toggle.setHomeAsUpIndicator(R.drawable.notification)
toggle.setDrawerIndicatorEnabled(false)

drawerLayout.addDrawerListener(toggle)
toggle.syncState()

// 关联导航菜单与NavController
NavigationUI.setupWithNavController(binding.navView, navController)

// 处理自定义图标的点击事件
override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        android.R.id.home -> {
            if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
                drawerLayout.closeDrawer(GravityCompat.START)
            } else {
                drawerLayout.openDrawer(GravityCompat.START)
            }
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

方案2:监听导航目的地变化(适用于无需DrawerLayout的场景)

如果仅需在特定页面显示自定义图标,通过监听NavController的目的地变化动态设置:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController

setSupportActionBar(binding.newToolbar)

// 监听导航目的地变化
navController.addOnDestinationChangedListener { _, destination, _ ->
    supportActionBar?.setDisplayHomeAsUpEnabled(true)
    if (destination.id == R.id.homeFragment) { // 仅在首页显示自定义图标
        supportActionBar?.setHomeAsUpIndicator(R.drawable.notification)
    } else { // 其他页面显示默认返回箭头
        supportActionBar?.setHomeAsUpIndicator(null)
    }
}

// 处理返回/图标点击事件
override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return if (item.itemId == android.R.id.home) {
        navController.navigateUp()
        true
    } else {
        super.onOptionsItemSelected(item)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:59:52