web-dev-qa-db-fra.com

Coordonnateur Mise en page à l'aide de RecyclerView de ViewPager

J'utilise la vue CoordinatorLayout de Android.support.design. Je veux joindre le app:layout_behavior au fragment RecyclerView?

Dans l'exemple donné par Google, ils l'attachent uniquement dans le RecyclerView du même fichier XML auquel le CoordinatorLayout était attaché.

Existe-t-il un moyen d'attacher CoordinatorLayout au RecyclerView du fragment dans le ViewPager?

L'exemple est dans cet article de blog à Android blog des développeurs.

48
Rod_Algonquin

Chris Banes a posté un échantillon sur Github qui montre exactement ce que vous voulez faire.

Voici le fichier XML qui définit comment associer indirectement une mise en page de coordinateur aux fragments du viewpager.

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

L'idée est de laisser au viewpager l'attribut layout_behavior.

60
androholic

Cela peut paraître idiot, mais cela n’a pas fonctionné car l’outil de compilation n’a pas été mis à jour dans le build.gradle de la version de l’application à 22, j’utilisais 21, c’est pourquoi elle ne fonctionne pas comme prévu.

Modifier:

Aussi ce que SanderTuit a dit: ajouter com.Android.support:recyclerview-v7:22.2.0 va également résoudre le problème

14
Rod_Algonquin

Utilisez un FrameLayout et injectez votre fragment dans ce FrameLayout. Puis définissez app: layout_behavior. La seule chose à faire est de définir layout_behavior sur un frère d'AppBayLayout et que ce dernier apparaisse sous la barre d'outils.

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

J'ai récemment eu le même problème mentionné dans le post, et les solutions ci-dessus ne fonctionnaient pas pour moi. Heureusement, j'ai réussi à le résoudre. Alors juste pour partager je poste ici

Le problème était que dans mon code j'avais mis

recyclerView.setNestedScrollingEnabled(false);

raison pour laquelle la barre d’application ne répondait pas aux parchemins de recyclerView malgré la définition de l’attribut layout_behaviour sur viewPager. Changer l'attribut mentionné ci-dessus en

recyclerView.setNestedScrollingEnabled(true);

le problème a été résolu et la barre d’application a commencé à répondre au parchemin de recylerView.

4
Majeed Khan

Après quelques tests, j'ai constaté que le fait de placer TabLayout en dehors de AppBarLayout fonctionnerait, quel que soit le fragment de viewpager. Ceci est mon XML principal.

<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>
1
weimin wang