45

如何使抽屉布局位于操作栏/工具栏下方?我正在使用v7:21应用程序compat库和新的ToolBar视图。如何让DrawerLayout显示在工具栏下方?

例子,我看到的样子

<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"> 

    <!-- drawer content --> 

</LinearLayout> 

<!-- normal content view --> 
<LinearLayout 
    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" /> 

    <!-- The rest of content view --> 

</LinearLayout> 

但随后的工具栏将被抽屉,这使得动画汉堡包图标(如v7.ActionBarDrawerToggle)被隐藏无用的,因为它不会是在抽屉下方可见,但我确实想使用新的工具栏视图来更好地支持Material主题。

那么如何做到这一点呢?是否可以将DrawerLayout作为非顶级视图?

+2

http://www.journaldev.com/12648/navigati onview-android – AnupamChugh 2016-09-19 08:24:52

+0

这可能有助于http://www.gadgetsaint.com/android/android-navigation-drawer-toolbar/#.WOBABBJ97fY – ASP 2017-04-02 00:11:30

+0

@AnupamChugh - 您在上面提供的链接(** journaldev.com/12648/navigationview- android **)的确是我想要的。谢谢!! – 2018-03-07 10:03:37

回答

93
<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"> 

    <!-- 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"> 

      <!-- drawer content --> 

     </LinearLayout> 

     <!-- normal content view --> 
     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 



      <!-- The rest of content view --> 

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

</LinearLayout> 
+4

欢迎来到SO!请给你的答案添加一些解释。 – 2014-10-24 19:57:40

+2

这样做对我来说,一旦实施,似乎很明显。工具栏需要放在抽屉布局上,而不是内部,然而Android开发人员在抽屉的根部有一个抽屉的例子,因为默认情况下,操作栏会超出顶部。 – NathofGod 2014-10-26 11:21:41

+0

这也适用于我。有意义 - 因为工具栏现在被认为是层次结构的一部分(与旧的操作栏相对),布局中的实际位置变得更加重要。 – 2014-10-27 07:09:05

21

您可以使用自定义的toolbar

,但周围的工作将设置一个top_margin到抽屉我不认为。 (对谷歌Play商店一样的东西!)

<!-- drawer view --> 
<LinearLayout 
    android:layout_marginTop="?attr/actionBarSize" 
... 

,如果你找到了一个更好的解决办法告诉我太;)

+3

似乎工作的一种解决方案是重新排列布局,使用LinearLayout作为布局,将ToolBar和DrawerLayout作为子项。 – user1309971 2014-10-21 08:48:23

+1

这是更好的解决方案。谢谢队友 – Darsh 2016-05-06 11:27:36

+1

解决我的问题...谢谢.. – Ironman 2016-07-05 06:45:10

5

改变你的抽屉布局风格类似如下

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

我有问题得到这个工作,并最终正确显示。下面是我使用的布局:

<LinearLayout...[add your namespaces, etc] 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:fitsSystemWindows="true"> 

    <android.support.v7.widget.Toolbar [your custom toolbar] /> 
    <android.support.v4.widget.DrawerLayout [your drawer layout] /> 
     <LinearLayout> 
      [content here] 
     </LinearLayout> 
    <android.support.design.widget.NavigationView /> 
</LinearLayout> 

小心走动的设计部件,如果是错误的根标签下,你会得到一个

“没有layout_gravity_left

异常。

4

我的解决办法:生成模板与Android 2.1.2工作室,抽屉模板:

只需要三个转变:设定保证金顶鉴于NavigationView和style.xml删除overloap状态栏

<item name="android:windowDrawsSystemBarBackgrounds">false</item> 

android:fitsSystemWindows="false" 

布局main.xml中设置的空白得到最高的大小动作条价值 android:layout_marginTop="?attr/actionBarSize"

<?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:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:layout_marginTop="?attr/actionBarSize" 
     android:fitsSystemWindows="false" 
     app:headerLayout="@layout/nav_header_main" 
     app:menu="@menu/activity_main_drawer" /> 

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

** false **样式设置仅适用于API Level 21及更高版本。我总是在API Level 17的基础上编写我的应用程序。所以这个解决方案对我来说不起作用... – 2018-03-07 09:52:10

+0

尝试放入values-21/styles.xml – Webserveis 2018-03-07 09:59:47

+0

它适用于我的API Level 17应用程序, * values-21/styles.xml **但系统窗口的顶部不再遵循应用程序主题,但有一个黑色的背景,这绝对不是我想要的应用程序的外观。我试过这个解决方案** https://www.journaldev.com/12648/navigationview-android**,它对我来说非常合适。 – 2018-03-07 10:11:41