Android Constraint Layout如何实现组件组间及组与屏幕端宽度均等?
在ConstraintLayout中实现垂直均等空间分配(类似LinearLayout的weight效果)
我来帮你搞定这个需求!在ConstraintLayout里要实现和LinearLayout一样的垂直权重分配,核心是用**垂直链(Vertical Chain)**配合权重属性,下面是具体的实现步骤和修改后的代码:
核心思路
我们需要把你的两个组件组(group1:textView7+editText6;group2:textView8+editText8)和父布局的上下边缘连成一条垂直链,然后给两个组设置相同的权重,让它们平分垂直空间,同时保证group1与group2之间、group2与屏幕底部的间距均等。
具体修改步骤
构建完整的垂直链
- 把
textView7的顶部约束到父布局顶部 - 把
textView8的顶部约束到editText6的底部 - 把
editText8的底部约束到父布局底部 - 给链的起始View(也就是
textView7)添加app:layout_constraintVertical_chainStyle="spread",让链内元素均匀分布空间
- 把
设置权重并开启约束高度
- 给
editText6和editText8设置android:layout_height="0dp"(也就是match_constraint,让ConstraintLayout控制它们的高度) - 给这两个View分别添加
app:layout_constraintVertical_weight="1",这样它们就会平分剩余的垂直空间
- 给
修改后的完整代码
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/constrait" android:layout_width="match_parent" android:layout_height="match_parent" android:minHeight="47dp" tools:context="example.com.constrait.MainActivity"> <!-- Group 1: 文本框+输入框 --> <TextView android:id="@+id/textView7" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:text="TextView" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="spread" /> <EditText android:id="@+id/editText6" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="8dp" android:layout_marginTop="4dp" android:background="@drawable/rounded_border_edittext" android:ems="10" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="@+id/textView7" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView7" app:layout_constraintBottom_toTopOf="@+id/textView8" app:layout_constraintVertical_weight="1" /> <!-- Group 2: 文本框+输入框 --> <TextView android:id="@+id/textView8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="4dp" android:text="TextView" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText6" /> <EditText android:id="@+id/editText8" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="8dp" android:layout_marginTop="4dp" android:layout_marginBottom="8dp" android:background="@drawable/rounded_border_edittext" android:ems="10" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="@+id/textView8" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView8" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintVertical_weight="1" /> </android.support.constraint.ConstraintLayout>
关键细节解释
- 垂直链的作用:
spread风格的垂直链会让链内的元素自动均匀分配可用空间,这和LinearLayout中设置weightSum+layout_weight的逻辑一致。 - 0dp的必要性:只有把需要权重分配的View高度设为
0dp,ConstraintLayout才会根据权重值来分配剩余的垂直空间,而不是用wrap_content或match_parent固定高度。 - 权重的意义:两个View的权重都设为1,意味着它们会平分父布局中除了固定高度元素(比如两个TextView)之外的所有垂直空间,自然就实现了你要的"group1与group2之间、group2与屏幕末端宽度均等"的效果。
内容的提问来源于stack exchange,提问作者Nikolas Bozic
相关产品推荐
相关产品推荐

