NestedScrollView et CoordinatorLayout. Problème sur le défilement

J'ai un problème étrange avec le CoordinatorLayout et le NestedScrollView (avec la bibliothèque de support de conception 22.2.0)

En utilisant un contenu inférieur à NestedScrollView je devrais avoir un contenu fixe. Cependant, en essayant de faire défiler le contenu de haut en bas, je peux obtenir que le contenu soit déplacé et plus jamais à leur place.

Voici un petit échantillon:entrez la description de l'image ici

Voici le code:

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

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

        <FrameLayout
            android:paddingTop="24dp"
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="@dimen/padding">

        </FrameLayout>

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

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_action"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="16dp"
        android:visibility="gone"
        android:src="@drawable/ic_done" />

</android.support.design.widget.CoordinatorLayout>
33
demandé sur Gabriele Mariotti 2015-06-12 17:54:21

5 réponses

Cela peut également être observé dans la démo cheesesquare lors de la suppression de toutes les cartes sauf une dans le fragment de détails.

J'ai pu résoudre cela (pour l'instant) en utilisant cette classe: https://gist.github.com/EmmanuelVinas/c598292f43713c75d18e

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="com.evs.demo.layout.FixedScrollingViewBehavior">
    .....   
</android.support.v4.widget.NestedScrollView>
37
répondu Paul Burke 2015-06-12 15:45:00

Je pense que ce n'est pas un bug dans la lib de support, il suffit d'utiliser ceci

<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:layout_gravity="fill_vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">
34
répondu LiFei 2015-07-21 05:58:23

android:layout_gravity="fill_vertical" ça a marché pour moi aussi.

4
répondu Ugo 2015-11-12 03:56:13

Je suis peut être en retard de ma réponse mais voilà. J'avais un problème similaire, mais aucune des solutions mentionnées ci-dessus ne fonctionnait pour moi. En fin de Compte, Je l'ai corrigé en utilisant la version 23 de la bibliothèque de support.

...
compileSdkVersion 23
...
targetSdkVersion 23
...
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:support-v4:23.1.0'
compile 'com.android.support:design:23.1.0'
3
répondu Aleks Nine 2015-10-25 14:07:21

La méthode onMeasureChild() est appelée plusieurs fois pendant le processus de mise en page. Apparemment, la clé est d'obtenir une valeur non nulle pour la taille de l'enfant au début du processus. ScrollingViewBehavior ne parvient pas à le faire dans ce qui suit:

int scrollRange = appBar.getTotalScrollRange();
int height = parent.getHeight() 
             - appBar.getMeasuredHeight()
             + scrollRange;

FixedScrollingviewBehavior corrige cela avec:

int height = parent.getHeight() 
             - appBar.getMeasuredHeight() 
             + Math.min(scrollRange, parent.getHeight() - heightUsed);

Qui très tôt donne à height la valeur de -128, la hauteur de la barre d'application.

Une alternative, proche de l'original est:

int height = parent.getMeasuredHeight()
             - appBar.getMeasuredHeight()
             + scrollRange;
2
répondu Jon 2015-07-01 21:47:46