Navigation Drawer Below Toolbar
Asked Answered
S

7

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?

Sandblind answered 18/11, 2014 at 1:52 Comment(4)
@Fetation 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.Sandblind
@Fetation How do I handle toolbar actions when the navigation bar is openSandblind
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 layoutFetation
Possible duplicate of How do I make DrawerLayout to display below the Toolbar?Andrey
R
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.

Receptive answered 18/11, 2014 at 2:33 Comment(7)
This will allow me to handle toolbar actions even when the drawer is open?Sandblind
Yes. Because the drawer will only respond to events to the Rect it is bounded.Receptive
But the status bar is overlapping the Toolbar now. How to resolve this?Gibbeon
@Diffy, you need to ask different question. However, seems that you have problem with your theme, otherwise, wrap the toolbar with padding View of size 25dp.Receptive
fitsystemwindows set to true causes that problem. Resolved anyway.Gibbeon
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.Homogamy
You can end up in a trouble where you will not get any clicks in the layout included inside. :( AM still trying to find out a way to get that sorted.Crank
U
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.

Unlisted answered 31/7, 2015 at 22:16 Comment(2)
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.Intangible
It still creates a shadow on the toolbar when sliding out. Thats not a desired effect. Not the best way to do it.Topside
E
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 ;)

Electrical answered 13/4, 2016 at 2:35 Comment(6)
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.Halation
Also i need to add android:layout_marginTop="?attr/actionBarSize" to DrawerLayout, to make content and navigation visible properly.Albertinealbertite
when i use this then data in fragment is un-clickable. plz say how to solveDaff
@roshan posakya where did you place your fragment?Bebe
@Charuka thanks to reply ,, but i solve this problem using different way..Daff
@PointerNull your app:insetForeground="@null" saved my day . it will hide that shadow above drawer.Breastpin
P
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

Procathedral answered 29/8, 2016 at 10:40 Comment(2)
This one works for putting it under a collapsing toolbar with a collapsing image. It stays under the image.Miskolc
Perfect. It should work for everyone.Riplex
R
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"
Reliant answered 28/8, 2016 at 20:55 Comment(0)
S
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>
Serviette answered 23/2, 2018 at 9:20 Comment(1)
android:fitsSystemWindows="false"Serviette
A
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.

Apatite answered 13/10, 2017 at 22:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.