Скрытие панели инструментов с помощью прокрутки с помощью recyclerview внутри фрагмента

Я пытаюсь свернуть панель инструментов при прокрутке, когда прокручивается recyclerview внутри фрагмента. Для начала, мой главный макет:

<DrawerLayout> <RelativeLayout android:id="@+id/mainRelativeLayout" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <android.support.design.widget.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" > <Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:elevation="5dp" app:layout_scrollFlags="scroll|enterAlways" > </Toolbar> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.design.widget.CoordinatorLayout> </RelativeLayout> <!-- ignore --> <drawercontents> </DrawerLayout> 

Так как вы, вероятно, можете догадаться, что мои фрагменты загружаются в @id/container . Мой первый фрагмент содержит recyclerview, и я устанавливаю app:layout_behavior="@string/appbar_scrolling_view_behavior" на этот recyclerview. Это работает, и панель инструментов рушится на прокрутке. Проблема заключается в том, что панель инструментов покрывает верхнее содержимое фрагмента, когда оно не свернуто. Добавление верхнего поля в контейнер фрагмента, равного размеру панели инструментов, просто приводит к тому, что пустое пространство остается слева, когда панель инструментов сворачивается (очевидно).

Что здесь отсутствует? Есть идеи?

EDIT: в соответствии с запросом, вот макет для фрагмента, содержащего recyclerview:

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.RecyclerView android:id="@+id/feed" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00000000" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

Сделайте одно имя макета как toolbar.xml и включите его в свой код, где хотите использовать, но напомните одно, пожалуйста, не используйте какой-либо другой формат, например Relativelayout, Linearlayout и другие

 <?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" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/tabanim_appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/tabanim_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways|snap" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> </android.support.design.widget.AppBarLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> 

Вам нужно что-то похожее на приложение для игрового магазина. Вставка макетов здесь. Код для этого прост, и вы можете его самостоятельно закодировать.

  1. FrameLayout
    • ImageView
    • ScrollView
      1. LinearLayout
      2. HorizontalScrollView
        • LinearLayout
    • ToolBar

С вышеуказанной иерархией раскладки вы можете добиться чего-то вроде этого:

Введите описание изображения здесь

Вы можете использовать Collapsing layout, например

 <?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" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapse_toolbar" android:layout_width="match_parent" android:layout_height="200dp" android:fitsSystemWindows="true" app:contentScrim="@color/zxing_transparent" android:paddingBottom="2dip" app:layout_scrollFlags="scroll|exitUntilCollapsed" app:expandedTitleGravity="bottom|center_horizontal" app:expandedTitleMarginBottom="50dip" app:collapsedTitleGravity="top|center_vertical" app:collapsedTitleTextAppearance="@style/collapseTitle"> <Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:elevation="5dp" app:layout_scrollFlags="scroll|enterAlways" > </Toolbar> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.design.widget.CoordinatorLayout> 

Я использовал SwipeRefreshLayout или просто LinearLayout или RelativeLayout как корень макета Fragment , и он работает.

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/swipe_refresh_layout_main" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/mycustomcolor" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.v4.widget.SwipeRefreshLayout> 

С RelativeLayout :

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/fragment2" 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/recycler_view_android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentStart="true" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </RelativeLayout> 

Тогда должно быть хорошо идти.

Мой друг, я сделал это сегодня и отлично работал, у меня есть 2 фрагмента, у которых есть RecyclerView и вы можете прокручивать Toolbar . Я посмотрел chrisbanes's CheeseSquare : CheeseSquare

Если вы посмотрите на MainActivity , в MainActivity есть 3 фрагмента, и все они могут прокручивать Toolbar . Поэтому я подготовил этот макет, возможно, вы посмотрите:

My activity_home.xml :

 <?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/drawer" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <include layout="@layout/content_home"/> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:fitsSystemWindows="true" android:layout_gravity="start" app:menu="@menu/homepage_leftdrawer"> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout> 

И content_home.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" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme3.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:layout_scrollFlags="scroll|enterAlways|snap" /> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabTextColor="@color/Transparent_few_white" app:tabIndicatorColor="@color/White" app:tabTextAppearance="@style/TabLayoutTextStyle" app:tabIndicatorHeight="3dp" app:tabSelectedTextColor="@color/White" android:background="@color/ColorPrimary" app:tabPaddingStart="0dp" app:tabPaddingEnd="0dp"/> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/pager2" android:layout_height="match_parent" android:layout_width="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> </android.support.design.widget.CoordinatorLayout> 

Где ключ здесь:

Если вы посмотрите на мой ViewPager , у него есть app:layout_behavior="@string/appbar_scrolling_view_behavior" Тогда это он. Не добавляйте другое поведение в фрагмент. Просто попробуй так и приди с результатом, пожалуйста!

Не тестировали это, но это то, что вы должны сделать:

  • Переместите app:layout_behavior="@string/appbar_scrolling_view_behavior" в FrameLayout с container id.
  • Добавьте android:fitsSystemWindows = "true" в ваш AppBarLayout .

Это именно то, что я делаю в своем приложении, и это работает. Если это не сработает для вас, попробуйте очистить (в Android Studio, Build -> Clean Project ) свой проект и снова запустить приложение.

Вы можете исправить это, добавив третий флаг – snap к свойству layout_scrollFlags .

 <Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:elevation="5dp" app:layout_scrollFlags="scroll|enterAlways|snap" /> 

Использование этого параметра определит, что делать, если представление только частично уменьшено. Если прокрутка заканчивается и размер представления уменьшен до менее чем 50% от его оригинала, то это представление вернется к исходному размеру. Если размер превышает 50% его размера, он полностью исчезнет.

Проверьте эту ссылку .

  <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:contentScrim="?attr/colorPrimary" > <android.support.v7.widget.Toolbar android:id="@+id/appBar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:layout_collapseMode="pin" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_below="@+id/app_bar_layout" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:weightSum="1"> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorAccent" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="Your recycler view should go here"/> </FrameLayout> </LinearLayout> 

Введите описание изображения здесь

В вашем наборе фреймов

 android:layout_below="@+id/appBarLayout" 

Если это не работает, попробуйте это:

 android:layout_below="@+id/toolbar"