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