web-dev-qa-db-ja.com

制約レイアウトを使用して加重LinearLayoutを模倣する方法

LinearLayoutの場合と同様に、制約レイアウトでスペースを均等に節約するにはどうすればよいですか?
たとえば、制約付きで記述された場合、以下のレイアウトはどのようになりますか?

<LinearLayout 
  Android:layout_width="match_parent"
  Android:layout_height="match_parent"
  Android:orientation="horizontal">

  <TextView
    Android:id="A"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:layout_weight="1" />

  <TextView
    Android:id="B"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:layout_weight="1" />

  <TextView
    Android:id="C"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:layout_weight="1" />

  <TextView
    Android:id="D"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:layout_weight="1" />
</LinearLayout>

制約レイアウトでは、ADをエッジに設定できます。A←B→D33バイアスとA←C→D 66のバイアスで、各要素間に等しいスペースがあります。
しかし、そのソリューションは実際には拡張性がありません。

制約レイアウトでこれを行う適切な方法はありますか?

9
oldergod

参考までに--- Constraint Layout alpha 9 追加 Chains 、これによりこの動作を実装できます。

enter image description here

18
Nicolas Roard

現時点では(制約レイアウトアルファ6)、これを行う他の唯一のオプションは、パーセント位置の垂直ガイドラインを使用することです。次に、ウィジェットごとに、次のようにガイドラインに制約します。左側<-ウィジェットA->ガイドライン1 <-ウィジェットB->ガイドライン2 <-ウィジェットC->右側

ガイドライン1は0.33、ガイドライン2は0.66です。

だが。

それは機能しますが、この特定のタスクに線形レイアウトを使用するよりも高速であるとは思えません。必要なのがこの正確な動作だけである場合は、線形レイアウトを使用するだけです(制約レイアウト内でも)。制約レイアウトでそれを行うことができる唯一の利点は、特定の軸に対してのみこの動作を定義できることです。他の軸は完全に異なる方法で制約できます(LLの場合は整列されますが、これが一般的なニーズです)。 。

制約レイアウトの将来のバージョンでは、この特定の動作をはるかに簡単にする計画がありますが、既存のすべてのレイアウトを使用しないようにする必要があるという意味ではありません。

7
Nicolas Roard

例えば:

<Button
    Android:id="@+id/btn_a"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="ButtonA"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/btn_b" />

<Button
    Android:id="@+id/btn_b"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="ButtonB"
    app:layout_constraintLeft_toRightOf="@+id/btn_a"
    app:layout_constraintRight_toLeftOf="@+id/btn_c" />

<Button
    Android:id="@+id/btn_c"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="ButtonC"
    app:layout_constraintLeft_toRightOf="@+id/btn_b"
    app:layout_constraintRight_toRightOf="parent" />
0
zonda