web-dev-qa-db-fra.com

CollapsingToolbarLayout et NestedScrollView ne fonctionnent pas

J'essaie d'implémenter CollapsingToolbarLayout avec un NestedScrollView et il affiche le TextView dans le NestedScrollView en bas et n'autorise pas le défilement ou la réduction de la barre d'outils. J'ai obtenu cela pour fonctionner avec un RecyclerView mais pas NestedScrollView. Lorsque je supprime app:layout_behavior="@string/appbar_scrolling_view_behavior, la barre d'outils se réduit, mais NestedScrollView n'est pas inférieur à AppBarLayout. Des solutions ou des suggestions pour résoudre ce problème?

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:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true">

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

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

            <TextView
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:gravity="center"
                Android:text="Hello"
                Android:textColor="#000"
                Android:textSize="16sp"/>
        </LinearLayout>
    </Android.support.v4.widget.NestedScrollView>

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

        <Android.support.design.widget.CollapsingToolbarLayout
            Android:id="@+id/collapsing_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                Android:id="@+id/backdrop"
                Android:layout_width="match_parent"
                Android:layout_height="134dp"
                Android:background="@color/primary"
                app:layout_collapseMode="parallax"/>

            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"/>
        </Android.support.design.widget.CollapsingToolbarLayout>
    </Android.support.design.widget.AppBarLayout>
</Android.support.design.widget.CoordinatorLayout>

Résultat

enter image description here

11
Eugene H

Passez à une certaine hauteur dans AppbarLayout. Exemple:

Android:layout_height="300dp". 

Le problème principal étant que la vue de défilement imbriquée n’a pas assez de vues pour provoquer un défilement. Par conséquent, l'effet de parallaxe ne fonctionnerait pas.

Voici un exemple de travail utilisant NestedScrollView et CollapsingToolbarLayout

7
Psypher

J'ai eu le même problème et écrit une sorte de solution miracle pour cela. En supposant que votre étiquette LinearLayout contenant "Hello" soit liée à mContainer et que votre Toolbar soit liée à mToolbar, vous pouvez utiliser ceci:

private void fixNestedScrollViewScrolling() {
    final int bottomMargin = getScreenHeight() - mContainer.getHeight() - mToolbar.getHeight();
    final FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
            mContainer.getLayoutParams());
    layoutParams.setMargins(0, 0, 0, bottomMargin);
    mContainer.setLayoutParams(layoutParams);
}

private int getScreenHeight() {
    final Display display = getWindowManager().getDefaultDisplay();
    final Point size = new Point();
    display.getSize(size);
    return size.y;
}

Cette méthode de correction est appelée dans la méthode onCreate de ma Activity:

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_single_post);

    fixNestedScrollViewScrolling();

    // some other stuff here ...
}
0
pxsx