68

I am trying to get the navigation drawer to open below the toolbar.

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/drawer_layout"
tools:context=".MainActivity">
<RelativeLayout
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content">
    <include layout="@layout/toolbar"
        android:id="@+id/toolbar"/>
    <FrameLayout
        android:layout_below="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/background_color"/>
</RelativeLayout>
<ListView
    android:id="@+id/drawer"
    android:layout_width="260dp"
    android:layout_height="match_parent"
    android:layout_below="@+id/toolbar"
    android:layout_marginTop="56dp"
    android:layout_gravity="start">
</ListView>
</android.support.v4.widget.DrawerLayout>

How do I reformat the xml so that the navigation bar opens below the toolbar?

4
  • 1
    @tyczj if you look at the latest version of the Google Play store. The navigation drawer is below the toolbar. I would like to implement something similar to that.
    – safaiyeh
    Commented Nov 18, 2014 at 1:57
  • @tyczj How do I handle toolbar actions when the navigation bar is open
    – safaiyeh
    Commented Nov 18, 2014 at 2:04
  • you dont, if you have actions you want the user to do when the drawer is open then you should put them in the drawers layout
    – tyczj
    Commented Nov 18, 2014 at 2:07
  • Possible duplicate of How do I make DrawerLayout to display below the Toolbar? Commented Apr 14, 2016 at 11:17

7 Answers 7

125

You should move DrawerLayout as top parent and move Toolbar out of DrawerLayout content container. In short this looks like:

RelativeLayout
 ----Toolbar
 ----DrawerLayout
     ---ContentView
     ---DrawerList 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/top_parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar">

        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/background_color" />

        <ListView
            android:id="@+id/drawer"
            android:layout_width="260dp"
            android:layout_height="match_parent"
            android:layout_below="@+id/toolbar"
            android:layout_gravity="start"
            android:layout_marginTop="56dp" />

    </android.support.v4.widget.DrawerLayout>
</RelativeLayout>

However, Material Design guidelines state that Navigation Drawer should be above the Toolbar.

7
  • This will allow me to handle toolbar actions even when the drawer is open?
    – safaiyeh
    Commented Nov 18, 2014 at 4:47
  • 1
    Yes. Because the drawer will only respond to events to the Rect it is bounded. Commented Dec 7, 2014 at 12:48
  • But the status bar is overlapping the Toolbar now. How to resolve this?
    – Diffy
    Commented Jan 12, 2015 at 10:16
  • 1
    fitsystemwindows set to true causes that problem. Resolved anyway.
    – Diffy
    Commented Jan 12, 2015 at 13:47
  • 5
    Excellent answer Nikola! just a little improvement. For the ListView use android:layout_marginTop="?attr/actionBarSize" and in the toolbar set the same value as height. Commented Apr 22, 2015 at 1:52
24

You should simply add

android:layout_marginTop="@dimen/abc_action_bar_default_height_material"

to your layout which you are using as drawer.

This will automatically adjust the navigation drawer below the toolbar and also supports different screen sizes.

2
  • 9
    Unfortunately, @dimen/abc_action_bar_default_height_material is marked as private in the compatibility library, so this solution is unsafe to use as the resource name may disappear in a future release of the library.
    – Ted Hopp
    Commented Apr 13, 2016 at 17:24
  • 5
    It still creates a shadow on the toolbar when sliding out. Thats not a desired effect. Not the best way to do it.
    – Ali Kazi
    Commented Sep 13, 2016 at 5:12
19

You can add layout_marginTop like this,

<android.support.design.widget.NavigationView
        android:layout_marginTop="@dimen/abc_action_bar_default_height_material"
        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/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

but drawer will appear as a the top layer to tool bar.


Here is another Choppy way to add it below to toolbar!!!

might not be the best but it works!

end result will look like this

enter image description here

If you create a project as a Navigation Drawer project(Navigation Drawer Activity) it will give you four XML files at the creation in your layout folder

  • app_bar_main
  • content_main
  • navigatin_main
  • activity_main

    enter image description here

how these xmls are linked? mostly i see include tag is used

Your Activity is linked with activity_main

  • activity_main has the app_bar_main and navigation_view(drawer)
  • app_bar_main has the toolbar and content_main by default

now lets remove activity_main and set its contents directly to app bar main and use it as the main layout for Activity.

To add the drawer under tool bar add it under the android.support.design.widget.AppBarLayout because is contains the toolbar and its should be on top.

here is an example of app_bar_main.XML

      <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="none.navhead.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>



    //------ taken from activity_main
    // content main
    <include layout="@layout/content_main" />

    // you need this padding
    <android.support.v4.widget.DrawerLayout
        android:paddingTop="?attr/actionBarSize"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:openDrawer="start">

        <android.support.design.widget.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/nav_header_main"
            app:menu="@menu/activity_main_drawer" />

    </android.support.v4.widget.DrawerLayout>


</android.support.design.widget.CoordinatorLayout>

p.s you can set app_bar_main.XML to setContentView of your activity just play around there are plenty of ways ;)

6
  • 7
    This one works for me also on API23, where NavigationView is designed to be drawn behind system status bar. However, it still had shadow drawn at top, as if it was still drawn behind status bar, so I had to add app:insetForeground="@null" to the NavigationView, and it's drawn correctly below action bar (or actually Toolbar). This way also the nicely animated arrow at top left is visible, not covered by the NavigationView. Commented Apr 24, 2016 at 21:05
  • Also i need to add android:layout_marginTop="?attr/actionBarSize" to DrawerLayout, to make content and navigation visible properly.
    – Sucipto
    Commented May 20, 2016 at 6:07
  • 1
    when i use this then data in fragment is un-clickable. plz say how to solve Commented Jan 18, 2017 at 7:37
  • @roshan posakya where did you place your fragment?
    – Charuක
    Commented Jan 18, 2017 at 7:56
  • @Charuka thanks to reply ,, but i solve this problem using different way.. Commented Jan 19, 2017 at 3:33
9

this is my layouts and work perfect: activity_main:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- AppBarLayout should be here -->
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    </android.support.design.widget.AppBarLayout>

    <!-- add app:layout_behavior="@string/appbar_scrolling_view_behavior" -->

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:openDrawer="start">

        <include
            layout="@layout/app_bar_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <android.support.design.widget.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/nav_header_main"
            app:menu="@menu/activity_main_drawer" />
    </android.support.v4.widget.DrawerLayout>
</android.support.design.widget.CoordinatorLayout>

app_bar_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
  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:layout_width="match_parent"
  android:layout_height="match_parent"
  android:fitsSystemWindows="true"
  tools:context=".activty.MainActivity">
<include layout="@layout/content_main"/>
</FrameLayout>

result: Bellow toolbar

enter image description here

2
  • This one works for putting it under a collapsing toolbar with a collapsing image. It stays under the image.
    – rosegrink
    Commented May 16, 2017 at 13:59
  • Perfect. It should work for everyone. Commented Sep 18, 2021 at 6:05
3

If you are using custom toolbar then use the drawer layout in this way..

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

    <!-- The toolbar -->
    <android.support.v7.widget.Toolbar  
        android:id="@+id/my_awesome_toolbar"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimary" />

    <android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <!-- drawer view -->
        <LinearLayout
            android:layout_width="304dp"
            android:layout_height="match_parent"
            android:layout_gravity="left|start">
            ....
        </LinearLayout>

    </android.support.v4.widget.DrawerLayout>

</LinearLayout>

and if you are not using custom toolbar then you have to set margin top to the drawer layout..

android:layout_marginTop ="?android:attr/actionBarSize"
3
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.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"
    android:fitsSystemWindows="false"
    tools:openDrawer="start">
    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <android.support.design.widget.NavigationView
        android:layout_marginTop="?attr/actionBarSize"
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="false"
        app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
1
  • android:fitsSystemWindows="false" Commented Feb 23, 2018 at 9:23
0

An Easy and Good solution is set fitsSystemWindows=false for

android.support.v4.widget.DrawerLayout

that has id as

android:id="@+id/drawer_layout"

And for navigationView set layout_marginTop as ?attr/actionBarSize that would get the actionbar size and set it as margin

Here is complete code of activity_main.xml that has both the changes listed above.

Not the answer you're looking for? Browse other questions tagged or ask your own question.