如何使用约束布局模仿加权 LinearLayout

How to mimick Weighted LinearLayout with a Constraint Layout

我们如何在约束布局中像在线性布局中一样节省 space?
比如下面的布局,如果写上约束会变成什么样子?

<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→D 设置为 33 偏置,将 A←C→D 设置为 66 偏置每个元素之间的 space 相等。
不过,该解决方案并没有真正扩展。

是否有在约束布局中执行此操作的正确方法?

目前(约束布局 alpha 6)执行此操作的唯一其他选择是使用具有百分比位置的垂直指南,然后对于每个小部件,以这种方式将它们限制在指南中: 左侧 <- 小部件 A -> 指南 1 <- 小部件 B -> 指南 2 <- 小部件 C -> 右侧

准则 1 为 0.33,准则 2 为 0.66。

但是

虽然它有效,但我怀疑它会比使用线性布局更快地完成这个特定任务——如果你想要的只是这个确切的行为,只需使用线性布局(即使在约束布局内)。它为您提供约束布局的唯一优势是您可以仅为给定轴定义此行为,另一个轴可以完全不同地约束(而对于 LL 它将对齐——但这是常见的需要) .

虽然我们确实计划在约束布局的未来版本中使这种特定行为更容易实现,但这并不意味着所有现有布局都不应再使用。

仅供参考 -- Constraint Layout alpha 9 added Chains,它允许您实现此行为。

例如:

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