Библиотека дизайна 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. Надеюсь, он будет работать.