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:
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>
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>
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">
Android:layout_gravity="fill_vertical"
a travaillé pour moi aussi.
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'
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;