web-dev-qa-db-fra.com

ConstraintLayout, lorsque la vue dépendante de la contrainte a disparu, la vue de présentation se comporte étrangement

J'utilise ConstraintLayout où je vais montrer ci-dessous

enter image description here

Je voudrais masquer First (en utilisant gone), et la vue que je m'attends à être comme ci-dessous (où ElasticBody s’étendra pour utiliser également l’espace de vue First original.

enter image description here

Cependant, lorsque je règle First sur gone, ma vue se présente comme ci-dessous (toutes les images à partir de Android Studio Design). Mon _Elastic Body_ est également manquant et la hauteur a augmenté étrangement.

enter image description here

Mon code de mise en page comme ci-dessous

_<Android.support.constraint.ConstraintLayout 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="wrap_content"
    Android:padding="16dp">

    <TextView
        Android:id="@+id/txt_first"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:background="#0ff"
        Android:text="First"
        Android:visibility="gone"
        Android:textSize="26sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/txt_body"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        Android:id="@+id/txt_body"
        Android:layout_width="0dp"
        Android:background="#f0f"
        Android:layout_height="wrap_content"
        Android:text="Elastic Body"
        Android:textSize="26sp"

        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/txt_tail"
        app:layout_constraintStart_toEndOf="@+id/txt_first"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        Android:id="@+id/txt_tail"
        Android:background="#ff0"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Tail"
        Android:textSize="26sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/txt_body"
        app:layout_constraintTop_toTopOf="parent" />

</Android.support.constraint.ConstraintLayout>
_

(Notez que si vous supprimez le gone, vous obtiendrez la première vue de l'image). Pourquoi cela est-il ainsi? Comment pourrais-je résoudre ce problème là où, lorsque mon First sera parti, je pourrais étirer le _Elastic Body_ correctement?

p/s: Je sais comment le faire dans LinearLayout et RelativeLayout ... mais je me demande s'il s'agit d'une limitation de ConstraintLayout?

20
Elye

See Output :

Essayez de suivre.

Définissez la constarint gauche et supérieure de la première vue sur parent. Après cela, définissez la largeur de la partie du corps sur "0dp" et fixez la contrainte gauche au premier côté droit et la contrainte droite au côté gauche de la vue arrière.

Ainsi, chaque fois que vous définissez la visibilité de la première vue, la vue du corps disparaît comme vous le souhaitez.

<Android.support.constraint.ConstraintLayout 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="wrap_content"
    Android:padding="16dp">

    <TextView
        Android:id="@+id/txt_first"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:background="#0ff"
        Android:text="First"
        Android:textSize="26sp"
        Android:visibility="gone"
        app:layout_constraintEnd_toStartOf="@+id/txt_body"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent" />

    <TextView
        Android:id="@+id/txt_body"
        Android:layout_width="0dp"
        Android:background="#f0f"
        Android:layout_height="wrap_content"
        Android:text="Elastic Body"
        Android:textSize="26sp"
        app:layout_constraintRight_toLeftOf="@+id/txt_tail"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/txt_first"
        />

    <TextView
        Android:id="@+id/txt_tail"
        Android:background="#ff0"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Tail"
        Android:textSize="26sp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintRight_toRightOf="parent" />

</Android.support.constraint.ConstraintLayout>
4
Shweta Chauhan

Une dernière chose que vous pouvez utiliser pour Visibility.GONE dans ConstraintLayout. vous pouvez utiliser Barriers pour cela.

si vous n'êtes pas au courant de Barriers, veuillez vérifier ceci: Barrières

20
Mehul Kabaria