J'ai un ConstraintLayout
dans un NestedScrollView
. La ConstraintLayout
contient un tas de vues, mais la dernière View
peut avoir une hauteur dynamique pour remplir l'espace inférieur si et s'il y en a une, mais elle doit également avoir une hauteur minimale s'il n'y a pas assez d'espace.
À titre d’argumentation, voici un exemple.
<Android.support.v4.widget.NestedScrollView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fillViewport="true">
<Android.support.constraint.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
tools:layout_height="match_parent">
<View
Android:layout_width="0dp"
Android:layout_height="0dp"
app:layout_constraintHeight_min="1500dp"
Android:background="@color/red"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</Android.support.constraint.ConstraintLayout>
</Android.support.v4.widget.NestedScrollView>
Comme vous pouvez le voir, j'ai mis la version ConstraintLayout
dans mais cela ne fonctionne pas. Évidemment, les valeurs sont ridiculement grandes, mais ce n’est que pour les tests.
Si je ne règle pas fillViewport="true"
sur la NestedScrollView
, alors la ConstraintLayout
a une hauteur de 0. Lorsque je configure la fillViewport
, la ConstraintLayout
ne défile pas mais remplit simplement l'écran.
Comment puis-je définir la vue pour qu'elle s'étende jusqu'au bas de la ConstraintLayout
qui devrait être aussi grande que la fenêtre d'affichage, mais si ma vue n'est pas de la minHeight
, nous autorisons le défilement?
J'utilise la version 1.0.2
de la bibliothèque ConstraintLayout
.
Ce que je compte voir, c’est être tout au fond du parent, mais si cette taille est inférieure à 1500dp
, la vue défile.
J'ai entré 1500dp comme si Android:layout_height="1500dp"
et la vue défile en conséquence.
MISE À JOUR 1
Semble être une fois que je mets la mise en page dans une FragmentViewPager
. La propriété app:layout_constraintHeight_min
n'est pas respectée et correspond uniquement à la hauteur de la fenêtre.
J'ai également essayé de prendre la variable NestedScrollView
du fragment et d'y placer la variable ViewPager
, mais cela n'a pas fonctionné.
Ajoutez cet attribut à la vue que vous souhaitez étirer:
app:layout_constraintHeight_default="spread"
J'ai fait une petite application pour démontrer. Pas de logique Java à proprement parler, mais voici la mise en page:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.NestedScrollView
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:fillViewport="true">
<Android.support.constraint.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:padding="16dp"
Android:background="#caf">
<TextView
Android:id="@+id/one"
Android:layout_width="0dp"
Android:layout_height="48dp"
Android:gravity="center"
Android:text="hello world"
Android:background="#fff"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/two"/>
<TextView
Android:id="@+id/two"
Android:layout_width="0dp"
Android:layout_height="48dp"
Android:gravity="center"
Android:text="hello world"
Android:background="#eee"
app:layout_constraintTop_toBottomOf="@+id/one"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/three"/>
<TextView
Android:id="@+id/three"
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:gravity="center"
Android:text="hello world"
Android:background="#ddd"
app:layout_constraintHeight_default="spread"
app:layout_constraintHeight_min="300dp"
app:layout_constraintTop_toBottomOf="@+id/two"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</Android.support.constraint.ConstraintLayout>
</Android.support.v4.widget.NestedScrollView>
La vue du bas s’étire pour remplir la fenêtre quand elle est plus petite que l’espace disponible restant, et le défilement est impossible:
La vue de dessous conserve une hauteur fixe lorsqu'elle est plus grande que l'espace disponible restant, ce qui rend le défilement possible:
J'utilise com.Android.support.constraint:constraint-layout:1.0.2
et cela fonctionne pour moi:
<Android.support.v4.widget.NestedScrollView 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:orientation="vertical">
<Android.support.constraint.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<View
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:background="@drawable/gradient"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_min="1500dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</Android.support.constraint.ConstraintLayout>
</Android.support.v4.widget.NestedScrollView>