web-dev-qa-db-fra.com

NestedScrollView et Coordinator Layout. Numéro sur le défilement

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

En utilisant un contenu plus petit que 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 ne soit plus jamais à leur place.

Voici un petit échantillon:enter image description here

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>
34
Gabriele Mariotti

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

J'ai pu résoudre ce problème (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
Paul Burke

Je pense que ce n'est pas un bug dans la librairie de support, utilisez simplement 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">
36
LiFei

Android:layout_gravity="fill_vertical" a travaillé pour moi aussi.

4
Ugo

Je suis peut-être en retard avec ma réponse, mais voilà. J'avais un problème similaire, mais aucune des solutions mentionnées ci-dessus n'a fonctionné pour moi. Finalement, 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
Aleks Nine

La méthode onMeasureChild () est appelée plusieurs fois au cours du processus de présentation. Apparemment, la clé obtient une valeur non nulle pour la taille de l'enfant tôt dans le processus. ScrollingViewBehavior échoue dans les cas suivants:

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
Jon