如何让DrawerLayout的NavigationView覆盖ActionBar及状态栏?
Hey there, let's sort out this issue where your NavigationView sits under the ActionBar and status bar, plus the ActionBar dims when the drawer opens. Here's how to get the drawer to overlay both bars properly:
1. Tweak Your App Theme First
We need to let your layout extend into the status bar area, and either make the default ActionBar transparent or switch to a custom Toolbar (the more flexible option).
Option 1: Use a No-ActionBar Theme & Add a Custom Toolbar
This is the most reliable approach because it puts you in full control of the Toolbar's layer.
First, update your res/values/styles.xml:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- Let layout stretch under the status bar --> <item name="android:windowTranslucentStatus">true</item> <item name="android:statusBarColor">@android:color/transparent</item> <!-- Optional: Stretch under navigation bar too if needed --> <item name="android:windowTranslucentNavigation">true</item> </style>
Then add the custom Toolbar to your main layout's ConstraintLayout:
<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- Custom Toolbar --> <com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@android:color/transparent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:menu="@menu/your_main_menu" /> <!-- Replace with your menu --> <FrameLayout android:id="@+id/fragmentContainer" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/toolbar" /> </androidx.constraintlayout.widget.ConstraintLayout>
Hook up the Toolbar in your MainActivity:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Set the custom Toolbar as ActionBar setSupportActionBar(toolbar) // Enable the drawer toggle icon supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_menu) // Use your menu icon // Rest of your code... replaceFragment(playlistFragment) sideMenu.setNavigationItemSelectedListener { item -> handleNavigationItemTap(item) true } }
Option 2: Keep Default ActionBar (Make It Transparent)
If you prefer sticking with the default ActionBar, make it transparent and allow layouts to overlay it:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar"> <item name="android:windowActionBarOverlay">true</item> <!-- Let content overlay ActionBar --> <item name="android:actionBarStyle">@style/TransparentActionBar</item> <item name="android:windowTranslucentStatus">true</item> <item name="android:statusBarColor">@android:color/transparent</item> </style> <style name="TransparentActionBar" parent="@style/Widget.MaterialComponents.ActionBar.Solid"> <item name="android:background">@android:color/transparent</item> <item name="background">@android:color/transparent</item> </style>
2. Adjust DrawerLayout & NavigationView Properties
Update your DrawerLayout XML to let the NavigationView extend into the status bar:
<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/drawerLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/background" android:fitsSystemWindows="false" <!-- Disable default system window fitting --> tools:context=".MainActivity" > <!-- Main content layout --> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <!-- Keep main content adjusted to system bars --> <!-- Your Toolbar and Fragment Container go here --> </androidx.constraintlayout.widget.ConstraintLayout> <com.google.android.material.navigation.NavigationView android:id="@+id/sideMenu" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:background="@drawable/navigation_menu_background" android:fitsSystemWindows="true" <!-- Let NavigationView stretch into status bar --> app:menu="@menu/navigation_menu" /> </androidx.drawerlayout.widget.DrawerLayout>
3. Fix the Dimming ActionBar Issue
When using the default ActionBar, it dims because it's in a higher layer than the DrawerLayout. The best fix here is using the custom Toolbar approach (Option 1 above) — since the Toolbar is part of the DrawerLayout's main content, it'll dim along with the rest of the content while the NavigationView sits on top.
If you must keep the default ActionBar, you can turn off the dimming by setting the DrawerLayout's scrim color to transparent:
<androidx.drawerlayout.widget.DrawerLayout ... android:scrimColor="@android:color/transparent" >
Note this only removes the dimming — the ActionBar will still sit above the NavigationView, so the custom Toolbar method is better for full overlay.
After making these changes, your NavigationView will overlay both the status bar and the Toolbar/ActionBar, and the drawer will behave exactly as you want it to.
内容的提问来源于stack exchange,提问作者Dinu Nicolae

