Библиотека дизайна Android CoordinatorLayout, AppBarLayout и DrawerLayout

Я использую библиотеку дизайна Android на API 22. Я бы хотел:

  • есть панель инструментов и DrawerLayout, внутри которых есть RecyclerView
  • иметь DrawerLayout ниже панели инструментов; например, когда панель инструментов видна, основное содержимое ящика должно быть ниже, а нижний ящик (слева) также должен быть ниже его, чтобы при его расширении панель инструментов все еще была видна.
  • С помощью панели инструментов прокручивается экран, когда прокрутка просмотра прокручивается вниз.

Возможно ли это? У меня проблемы с вступлением в брак №2 и №3. Теперь это то, что панель инструментов всегда находится над макетом ящика, охватывая первую запись в ресайклере и верхнюю часть левого ящика. Вот мой файл макета (неполный, но показывающий мою структуру):

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.DrawerLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"/>

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

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Toolbar
            android:layout_width="match_parent"
            android:layout_height="?android:attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"/>

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

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

Похоже, что приложение RecyclerView app: layout_behavior = "@string/appbar_scrolling_view_behavior" не действует, потому что при удалении поведение одинаковое.

Я попытался добавить RelativeLayout в качестве дочернего элемента CoordinatorLayout, чтобы определить, что ящик находится под панелью инструментов и т.д., но ничего не работает.

Я пытаюсь сделать это с помощью библиотеки?

Ответы

Ответ 1

Попробуйте следующее, если вы хотите увидеть анимацию значка и стрелки гамбургера. Если вы включите верхнее поле (layout_marginTop) для NavigationView, оно переместит его вниз.

<?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"
    android:id="@+id/navigation_drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_scrollFlags="scroll|enterAlways" />

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

        <!-- main content view -->
        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/background_light"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

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

    <!-- The navigation drawer -->
    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="?attr/actionBarSize"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:menu="@menu/drawer_menu"/>

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

Ответ 2

Да! Это возможно.

<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/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinatorLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".StartupActivity">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appBarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                android:id="@+id/app_bar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"
                app:theme="@style/Theme.AppCompat.NoActionBar"/>

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

        <android.support.v7.widget.RecyclerView
            android:id="@+id/scrollRecyclerView"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            />

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/drawer_recycler_view"
        android:layout_width="320dp"
        android:layout_height="match_parent"
        android:layout_gravity="left|start"
        android:background="@color/WhiteColor"
        android:fitsSystemWindows="true"
        android:scrollbars="vertical"/>

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

Как вы можете видеть, важно то, что вы устанавливаете app:layout_scrollFlags="scroll|enterAlways" для скрытия вашей панели инструментов при прокрутке. RecyclerView в нижней части кода находится тот, что находится внутри DrawerLayout, тот, что указан выше, соответствует вашему основному виду деятельности.

Ответ 3

На странице разработчиков:

DrawerLayout действует как контейнер верхнего уровня для содержимого окна, который позволяет отображать интерактивные "выдвижные ящики" с края окна.

Сначала попробуйте разместить DrawerLayout в качестве контейнера верхнего уровня (то есть родительского макета). Затем поместите координаторLayout ниже и посмотрите, что произойдет.

Кроме того, вы не добавили NavigationView. Пожалуйста, ознакомьтесь с основными инструкциями здесь.

Ответ 4

Попробуйте это, он должен работать, работал у меня.

    <android.support.design.widget.CoordinatorLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|enterAlways"
                />

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

        <android.support.v4.widget.DrawerLayout
            android:id="@+id/drawer_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
           app:layout_behavior="@string/appbar_scrolling_view_behavior"
            >
          <android.support.v7.widget.RecyclerView
                 android:id="@+id/scrollingRecyclerView"
                 android:layout_width="match_parent"
                 android:layout_height="fill_parent"
        />

            <!-- The navigation drawer -->
            <FrameLayout
                android:id="@+id/right_frame"
                android:layout_height="match_parent"
                android:layout_gravity="start"/> (whatever)

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

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

Поведение прокрутки должно быть установлено на прямой дочерний элемент CoordinatorLayout (на DrawerLayout). Это должно устранить проблемы # 2, # 3. И в случае, если содержимое вашего ящика содержит recyclerView Панель инструментов, будет снова прокручиваться с экрана.

Ответ 5

Это было давно, но я считаю, что это все еще помогает кому-то. Layer Layout должен иметь один макет ребенка. Согласно андроидным документам, он должен быть FrameLayout, потому что порядок XML подразумевает z-порядок, и ящик должен быть поверх содержимого. Перейдите по ссылке ниже.

Создание ящика навигации

Добавьте AppBarLayout, Панель инструментов, RecyclerView и все другие представления в FrameLayout и сделайте его дочерним элементом Layer Layout. Надеюсь, он будет работать.