web-dev-qa-db-ja.com

ConstraintLayout、制約依存ビューがなくなると、レイアウトビューの動作がおかしい

以下に示すConstraintLayoutを使用しています

enter image description here

First(非表示を使用)を非表示にしたいと思います。また、以下のように表示する予定です(ElasticBodyは元のFirstビュースペースも使用するためにストレッチします)。

enter image description here

ただし、実際にFirstgoneに設定すると、ビューは次のようになります(すべての画像はAndroid Studio Designビュー)からです。私のElastic Bodyも欠落しており、高さが奇妙に拡大しました。

enter image description here

以下の私のレイアウトコード

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

goneを削除すると、最初の画像ビューが表示されます)。これはなぜですか? Firstがなくなったときに、Elastic Body正しく伸びますか?

p/s:LinearLayoutとRelativeLayoutでそれを行う方法は知っていますが、これがConstraintLayoutの制限かどうか疑問に思いますか?

20
Elye

See Output :

以下を試してください。

最初のビューの左と上のconstarintを親に設定します。その後、ボディパーツの幅を「0dp」に設定し、左の制約を最初のビューの右側に、右の制約をテールビューの左側に設定します。

したがって、最初のビューの可視性を設定すると、ボディビューは必要に応じてストレッチされます。

<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

ConstraintLayoutVisibility.GONEに使用できるもう1つのこと。そのためにBarriersを使用できます。

Barriersについて知らない場合は、これをチェックしてください: バリア

20
Mehul Kabaria