45

Как сделать макет ящика ниже панели действий/панели инструментов? Я использую v7: 21 app compat library с новым представлением 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) бесполезно, так как он не будет видимый под ящиком, но я хочу использовать новое представление ToolBar для лучшей поддержки темы Material.

Итак, как это осуществить? Возможно ли, что DrawerLayout будет отображаться не на верхнем уровне?

+2

http://www.journaldev.com/12648/navigati onview-android – AnupamChugh

+0

Это может помочь http://www.gadgetsaint.com/android/android-navigation-drawer-toolbar/#.WOBABBJ97fY – ASP

+0

@AnupamChugh - ссылка, которую вы указали выше (** journaldev.com/12648/navigationview- android **) действительно то, что я искал. Благодаря!! –

ответ

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! Пожалуйста, добавьте некоторое объяснение в свой ответ. –

+2

Это сделало это для меня, кажется настолько очевидным после внедрения. Панель инструментов должна находиться на макете ящика, а не внутри, однако в примерах ящика на Android Developers есть ящик в корне, поскольку панель действий по умолчанию была бы сверху. – NathofGod

+0

Это сработало и для меня. Имеет смысл - поскольку теперь панель инструментов считается частью иерархии (в отличие от старой панели действий), фактическое размещение в макете становится более важным. –

21

я не думаю, что вы можете при использовании пользовательскихtoolbar

но работа вокруг будет установить top_margin в ящик. (то же самое на Google Play Маркете)

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

если вы нашли лучшее решение сказать мне тоже;)

+3

Одним из решений, которое, похоже, работает, является изменение порядка компоновки с использованием LinearLayout относительно макета с помощью ToolBar и DrawerLayout в качестве дочерних элементов. – user1309971

+1

это лучшее решение. Спасибо mate – Darsh

+1

Решите мою проблему ... Спасибо .. – Ironman

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 Studio 2.1.2, шаблон ящик:

нужно только три изменения: установить маржу сверху в режиме NavigationView и удалить overloap строку состояния в style.xml

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

android:fitsSystemWindows="false" 

расположение main.xml набор запас сверху получить размер значение ActionBar 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 21 и выше. Я всегда кодирую свои приложения на основе уровня API 17. Это решение не работает для меня ... –

+0

Попробуйте ввести значения-21/styles.xml – Webserveis

+0

Он работает для моего приложения API уровня 17, когда вы его помещаете * * values-21/styles.xml **, но затем верхняя часть окна системы больше не следует за темой приложения, но имеет черный фон, который определенно не выглядит так, как я хочу для приложения. Я пробовал это решение ** https: //www.journaldev.com/12648/navigationview-android**, и он отлично работает для меня. –

Смежные вопросы