首页 > 解决方案 > 约束布局将多个视图分组为链中的单个项目

问题描述

我想在使用 ConstraintLayout 链接时实现以下布局,而不使用任何其他布局。视图之间的所有间距都应该相等。

1

此处回答了类似的问题,但视图之间的间距不相等。

标签: androidandroid-constraintlayout

解决方案


一般来说,如果没有任何额外的视图和嵌套,平面视图层次结构无法实现所需的行为。

但是有一种特殊情况的解决方法,您可以事先知道视图 3 和 4 的宽度。对于该解决方法,您需要在view 3和下方添加一个额外的不可见视图view 4。附上示例代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="match_parent">

<View
    android:id="@+id/view1"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@color/colorAccent"
    app:layout_constraintEnd_toStartOf="@id/view2"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<View
    android:id="@+id/view2"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@color/colorAccent"
    app:layout_constraintEnd_toStartOf="@id/stub_view"
    app:layout_constraintStart_toEndOf="@id/view1"
    app:layout_constraintTop_toTopOf="parent" />

<View
    android:id="@+id/stub_view"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:background="@color/colorPrimary"
    app:layout_constraintEnd_toStartOf="@id/view5"
    app:layout_constraintStart_toEndOf="@id/view2"
    app:layout_constraintTop_toTopOf="parent" />

<View
    android:id="@+id/view3"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_marginEnd="0dp"
    android:background="@color/colorAccent"
    app:layout_constraintStart_toStartOf="@id/stub_view"
    app:layout_constraintTop_toTopOf="parent" />

<View
    android:id="@+id/view4"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@color/colorAccent"
    app:layout_constraintEnd_toEndOf="@id/stub_view"
    app:layout_constraintTop_toTopOf="parent" />

<View
    android:id="@+id/view5"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@color/colorAccent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@id/stub_view"
    app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

如果您在运行时不知道和的确切宽度View 3-View 4您可以使用更多技巧并将 LayoutChangeListeners 设置为这些视图以监视它们的宽度并在运行时相应地更改存根视图的宽度。但我不建议使用第二种解决方法,因为它很可能会在您的代码库中添加更多有味道的代码。

在您使用此解决方法之前,请考虑使用视图嵌套并将View 3View 4放入一个LinearLayout(或ViewGroup您选择的其他)中。


推荐阅读