16

Я пытаюсь заставить панель инструментов свернуть при прокрутке, когда прокрутка recyclerview внутри фрагмента. Для того, чтобы начать, Heres мой основной макет:Скрытие панели инструментов на прокрутке с использованием 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"/> 
+0

Можете ли вы опубликовать также свой фрагмент? – saeed

+0

@saeed добавлен, проверьте редактирование. – Orbit

+0

Позвольте мне проверить, что у меня такая же проблема ... и я решил свой собственный ... Мне нужно мало времени – saeed

ответ

-1

в вашем framelayout установить

android:layout_below="@+id/appBarLayout" 

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

android:layout_below="@+id/toolbar" 
+2

'android: layout_below' может использоваться с детьми' RelativeLayout'. «CoordinatorLayout» - это в основном расширенная версия «FrameLayout», поэтому ничего не делает. – Orbit

0

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

enter image description here

+0

Это не имеет ничего общего с этой проблемой. – Orbit

+0

извините .. но вы хотите свернуть панель инструментов, если вы изучите этот фрагмент кода, который у вас есть. Если вы не хотите, чтобы изображение выглядело, удалите это ... этот код работает как макет профиля whatsapp ... так что вы не хотите, чтобы изображение удаляло его ... просто попробуй, ты увидишь его работу –

+0

сейчас проверяй его, я удалил изображение, просто использую его в коде и любезно удаляю -1 голос –

2

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

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

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

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

мой 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, i t имеет app:layout_behavior="@string/appbar_scrolling_view_behavior" атрибут Тогда вот оно. Не добавляйте другое поведение в фрагмент.Просто попробуйте вот так и придите с результатом, пожалуйста!

+0

, это результат, который я получаю: https://www.youtube .com/watch? v = v7fxM1pSrqw – Manos

+0

Можете ли вы попытаться добавить поведение к вашему recylerview –

3

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

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

С выше иерархии макета вы можете достичь что-то вроде этого:

enter image description here

2

не проверял это еще, но это то, что вы должны do:

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

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

4

Сделать одно имя макета как toolbar.xml и включить его в свой код, где вы хотите использовать, но напомнить одну вещь, пожалуйста, не используйте любой другой макет, как RelativeLayout, LinearLayout и других на сверху

3

Вы можете использовать Рушится макет как

<?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> 
2

Вы можете это исправить, добавив третий флаг - 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% его размера, он полностью исчезнет.

этот link.

5
<?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> 
+0

Это хорошо работает. –

+1

Могу ли я спросить, какое содержимое переменной «string/appbar_scrolling_view_behavior» – iOSAndroidWindowsMobileAppsDev

0

Также столкнулся с этой проблемой. Но решение было найдено. Решение с переработкой xml не может быть, поэтому вам нужно делать это программно. Все, что нам нужно, это Inflater. Да, да, это так просто.На лету измените xml, чтобы работать со всеми прокрутками.

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