web-dev-qa-db-fra.com

La barre d'outils ne s'effondrera pas avec Scrollview en tant qu'enfant de CoordinatorLayout

J'essaie de suivre les documents Google sur l'utilisation de CoordinatorLayout, mais je rencontre un problème avec ScrollView dans CoordinatorLayout. Fondamentalement, la barre d’outils s’effondrerait normalement avec un RecyclerView ou une ListView lors du défilement. Maintenant, avec un ScrollView, il ne sera pas réduit.

<Android.support.design.widget.CoordinatorLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <ScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >

        <TextView
            Android:id="@+id/tv_View"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_gravity="center"
            Android:gravity="center"
            Android:text="@string/filler"
            style="@style/TextAppearance.AppCompat.Large"
            />

    </ScrollView>

    <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"
            app:layout_scrollFlags="scroll|enterAlways"
            />

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

    </Android.support.design.widget.CoordinatorLayout>
59
AmaJayJB

Le ScrollView ne coopère pas avec le CoordinatorLayout. Vous devez utiliser NestedScrollView au lieu de ScrollView

140
TheoK

Utilisez NestedScrollView pour réduire votre vue défilement en tant qu'enfant de la disposition de coordinateur. Remplacez votre code par ce code:

<Android.support.design.widget.CoordinatorLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Android.support.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
                 Android:layout_height="match_parent"
                 app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:orientation="vertical">

        <TextView
            Android:id="@+id/tv_View"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_gravity="center"
            Android:gravity="center"
            Android:text="@string/filler"
            style="@style/TextAppearance.AppCompat.Large"
            />

    </LinearLayout>
    </Android.support.v4.widget.NestedScrollView>

    <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"
            app:layout_scrollFlags="scroll|enterAlways"
            />

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

    </Android.support.design.widget.CoordinatorLayout>
36
Anupriya

Vous pouvez conserver le ScrollView et ajouter cette propriété XML: Android:nestedScrollingEnabled="true" donc il connaît le CoordinatorLayout en tant que frère et garde à l'esprit que cette propriété est prise en charge uniquement dans Lollipop version et au-dessus.

Utilisez un NestedScrollView au lieu d'un ScrollView normal lorsque vous utilisez CoordinatorLayout.

Pour faire défiler le CollapsingToolbarLayout, vous pouvez déclencher le comportement de défilement en définissant une hauteur minimale de la disposition enfant du NestedScrollView à * 1000dp.

Android:minHeight="1000dp"

Disposition:

<Android.support.v4.widget.NestedScrollView
app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <!--to trigger scroll behavior-->
    <LinearLayout Android:minHeight="1000dp"/>

</Android.support.v4.widget.NestedScrollView>

* Exemple de SupportDesignDemos ici: https://github.com/Android/platform_development/blob/master/samples/SupportDesignDemos/res/layout/include_appbar_scrollview.xml

2
TouchBoarder

La réponse réelle devrait être que CoordinatorLayout ne fonctionne pas avec ScrollView, parce que ScrollView ne met pas en œuvre NestedScrollingChild interface. NestedScrollView est un ScrollView avec NestedScrollingChild implémentation. Si vous voulez en savoir plus sur le défilement imbriqué, j'ai fait un blog post à ce sujet.

1
Grzegorz Gajewski