Navigation Drawer汉堡菜单图标无法修改问题求助
使用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
相关产品推荐
相关产品推荐

