web-dev-qa-db-fra.com

Découvre avec minHeight dans ConstraintLayout

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

8
StuStirling

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:

 enter image description here

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:

 enter image description here  enter image description here

12
Ben P.

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>
0
Mehmed