CoordinatorLayout с использованием ViewPager RecyclerView

Я использую представление CoordinatorLayout из android.support.design. Я хочу присоединить app:layout_behavior к RecyclerView фрагмента?

В примере, приведенном Google, они прикрепляют его только к RecyclerView того же XML-файла, к которому был прикреплен CoordinatorLayout.

Есть ли способ присоединить CoordinatorLayout к RecyclerView фрагмента внутри ViewPager?

Пример находится в этой записи в блоге разработчиков Android.


comment
как решил? я также сталкиваюсь с той же проблемой внутри прокрутки"> stackoverflow.com/questions/32288013/   -  person Erum    schedule 31.08.2015


Ответы (6)


Крис Бейнс разместил на Github пример, который точно показывает, что вы хотите сделать.

Вот файл xml, который определяет, как можно косвенно прикрепить макет координатора к фрагментам окна просмотра.

<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
        android:id="@+id/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/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_scrollFlags="scroll|enterAlways" />

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

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

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="@dimen/fab_margin"
        android:src="@drawable/ic_done" />

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

Идея состоит в том, чтобы позволить viewpager иметь атрибут layout_behavior.

person androholic    schedule 30.05.2015
comment
у вас есть ссылка с гитхаба? - person pablobaldez; 03.06.2015
comment
@androholic, как ты решил? stackoverflow .com/questions/32288013/ - person Erum; 31.08.2015
comment
Можно ли использовать app:layout_behavior в любом представлении на странице просмотра? Например, не перерабатывающее представление, такое как прокрутка? - person Song; 23.12.2015
comment
привет, как создать представление с прокручиваемым окном просмотра и представлением карты переработчика вместе с панелью поиска, когда пользователь прокручивает вниз, сворачивает изображения окна просмотра и изменения в панели инструментов выглядят как приложение Google Play Store, пожалуйста, помогите мне вместе с навигационным ящиком. - person Harsha; 09.02.2016
comment
Это работает, когда у меня есть RecyclerView внутри фрагмента, но когда я помещаю BottomModalSheet, это не работает. Он не улавливает события прокрутки. Есть идеи? - person Gokhan Arik; 22.11.2016

Это может быть глупо, но это не сработало из-за того, что инструмент сборки не был обновлен в build.gradle версии приложения до 22, я использовал 21, поэтому он не работает должным образом.

Редактировать:

Также то, что сказал SanderTuit: добавление com.android.support:recyclerview-v7:22.2.0 также решит проблему

person Rod_Algonquin    schedule 31.05.2015
comment
Я хотел бы добавить к этому, что вам также нужна последняя версия RecyclerView: com.android.support:recyclerview-v7:22.2.0. - person SanderTuit; 01.06.2015
comment
Спас мой день! Спасибо! - person Kiril Aleksandrov; 11.07.2015
comment
Есть ли способ сохранить все библиотеки поддержки в самой новой версии, не редактируя каждый раз build.gradle? - person Tomas K; 10.08.2015
comment
@TomasK, вы всегда можете поставить знак плюса после версии, чтобы указать на использование последней версии библиотеки, com.android.support:design:22.+ - person Rod_Algonquin; 11.08.2015
comment
У меня это так, но кажется, что Android Studio все еще не обновляет его. Есть ли кнопка проверки обновлений? - person Tomas K; 11.08.2015
comment
привет, как создать представление с прокручиваемым окном просмотра и представлением карты переработчика вместе с панелью поиска, когда пользователь прокручивает вниз, сворачивает изображения окна просмотра и изменения в панели инструментов выглядят как приложение Google Play Store, пожалуйста, помогите мне вместе с навигационным ящиком. - person Harsha; 09.02.2016

Используйте FrameLayout и введите свой фрагмент в этот FrameLayout. Затем установите для него app:layout_behavior. Единственное, что вам нужно сделать, это установить layout_behavior равным AppBayLayout, и этот родственный элемент будет находиться под панелью инструментов.

<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
    android:id="@+id/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/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:layout_scrollFlags="scroll|enterAlways" />

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

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

<FrameLayout
    android:id="@+id/frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.CoordinatorLayout>
person Jam    schedule 30.05.2015
comment
Это проверено? Я имею в виду, что у меня похожий макет, но панель инструментов не реагирует на события прокрутки viewpager внутри моего фрагмента (который вводится в FrameLayout) - person Vamsi Challa; 10.06.2015
comment
CoordinatorLayout вообще не прокручивается, когда Framelayout содержит представление повторного использования. - person Roadblock; 17.08.2015
comment
У меня работает с корнем RecyclerView как Fragment в @+id/frame - person Yaroslav Mytkalyk; 22.12.2015

Недавно у меня была та же проблема, упомянутая в посте, и приведенные выше решения не сработали для меня. К счастью, мне удалось ее решить. Так что просто поделиться я размещаю здесь

Проблема заключалась в том, что в моем коде я установил

recyclerView.setNestedScrollingEnabled(false);

из-за чего панель приложения не реагировала на прокрутки recyclerView, несмотря на установку атрибута layout_behaviour для viewPager. Изменение вышеупомянутого атрибута на

recyclerView.setNestedScrollingEnabled(true);

решил проблему, и панель приложений начала реагировать на прокрутку recylerView.

person Majeed Khan    schedule 04.02.2017
comment
Ты спас мой день. Я был немым. У меня был такой же код. И я даже не знал, для чего этот код, когда вставлял его. setNestedScrollingEnabled необходим, если RecyclerView обернут NestedScrollView, но он удалит функцию повторного использования RecyclerView. - person wonsuc; 17.09.2017

После нескольких тестов я обнаружил, что поместив TabLayout вне AppBarLayout, он будет работать, независимо от того, что содержит фрагмент просмотра страницы. Это мой основной xml.

<com.tqmall.legend.konwledge.view.VerticalSwipeRefreshLayout       xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/coordinator_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFE6ECF0">

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

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:contentScrim="@android:color/black"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <include
                layout="@layout/banner_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.9" />

            <android.support.v7.widget.Toolbar
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:layout_gravity="bottom"
                android:background="#33000000"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

            </android.support.v7.widget.Toolbar>

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

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

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

        <android.support.design.widget.TabLayout
            android:id="@+id/main_fragment_issue_list_tab"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            app:tabGravity="center"
            app:tabIndicatorColor="#FF2CA2D5"
            app:tabPaddingEnd="30sp"
            app:tabPaddingStart="30sp"
            app:tabSelectedTextColor="#FF2CA2D5"
            app:tabTextColor="#FF4F5354" />

        <android.support.v4.view.ViewPager
            android:id="@+id/main_fragment_issue_list_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
person weimin wang    schedule 07.09.2015
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person Jeremy Huddleston Sequoia; 07.09.2015
comment
@JeremyHuddlestonSequoia Спасибо :-), я отредактирую. - person weimin wang; 07.09.2015
comment
Как разработать дизайн Flipkart HomeScreen с панелью инструментов координат с изображениями на пейджере и дизайном макета поиска recyclerview - person Harsha; 26.02.2016

У меня та же проблема, я решил прокрутку, но поместил панель инструментов и вкладки внутри панели приложения и обернул ее и пейджер с помощью координатора. Также в макете моего представления корзины (для увеличения) я добавляю layout_behavior. Это работает, но проблема в том, что все друг над другом.

Это моя главная страница

 <android.support.design.widget.CoordinatorLayout

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/music_foot"

    >
    <android.support.v4.view.ViewPager

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/view_pager"
        />
    <view
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        class="android.support.design.widget.AppBarLayout"
        android:id="@+id/appBar"
        > 
<android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="#1e88e5"
        android:id="@+id/toolbar"
        app:layout_scrollFlags="scroll|enterAlways"
        ></android.support.v7.widget.Toolbar>
        <view
            android:layout_width="match_parent"
            android:layout_height="56dp"
            class="com.astuetz.PagerSlidingTabStrip"
            android:id="@+id/pager_tabs"
            android:layout_below="@+id/appBar"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />
    </view>

and this is my layout for the adapter

   <android.support.v7.widget.RecyclerView

   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"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:id="@+id/recycleView" />

Если я заставлю его работать лучше, я скажу вам.

person Tarek Srour    schedule 30.05.2015