Set width to match constraints in ConstraintLayout

我想约束一个视图的左边和右边到它的父视图的边距,并使其填充分配的空间。但是,将宽度设置为 match_parentwrap_content似乎会产生相同的结果。

是否有一些等价的匹配 _ 约束(相反的匹配 _ 父和包装 _ 内容) ?match_parentwrap_content是影响布局还是在新的约束布局中忽略它们?

127798 次浏览

ConstraintLayout不支持 match_parent。请将宽度设置为 0dp以使其匹配约束。

不支持 match_parent,因此使用 android:layout_width="0dp"。使用 0dp,您可以将约束看作是“可伸缩的”,而不是“填充剩下的”。

此外,0dp可以由一个位置定义,其中 match_parent依赖于它的父节点来定义它的位置(x,y 和 width,height)

不允许使用 match_parent。但是您实际上可以将 width 和 height 设置为0dp,并将 top 和 bottom 或 left 和 right 约束设置为“ father”。

例如,如果你想在元素的宽度上有 match_parent约束,你可以这样做:

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>

显然,match_parent是:

  • 对于直接在 ConstraintLayout下的视图,不可以
  • 对于嵌套在直接位于 ConstraintLayout下的视图中的视图,OK

因此,如果你需要你的意见作为 match_parent的功能,然后:

  1. 直接使用 ConstraintLayout 的儿童应使用 0dp
  2. 嵌套元素 (例如,孙子约束布局)可以使用 match_parent

例如:

<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="16dp">


<android.support.design.widget.TextInputLayout
android:id="@+id/phoneNumberInputLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">


<android.support.design.widget.TextInputEditText
android:id="@+id/phoneNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>


</android.support.design.widget.TextInputLayout>

设置宽度或高度(任何你需要匹配父级)为0dp,并设置左边距,右边距,上边距,下边距作为匹配父级

为了让你的视图成为 match _ father 是不可能的,但是我们可以用一些不同的方法来做,但是不要忘记在 Start 和 End 中使用 Left 和 Right 属性,因为如果你使用 RTL 支持,它将是必需的。

    <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>

From the 官方文件:

重要提示: 不建议将 MATCH _ PARENT 用于包含在 ConstraintLayout. Similar behavior can be defined by using MATCH_CONSTRAINT with the corresponding left/right or top/bottom constraints being set to "parent".

因此,如果你想达到 MATCH_PARENT效果,你可以这样做:

<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

in the office doc: Https://developer.android.com/reference/android/support/constraint/constraintlayout

当维度设置为 MATCH _ CONSTRINT 时,默认行为是让结果大小占用所有可用空间。

使用0dp,相当于“ MATCH _ CONSTRINT”

重要提示: 不建议对 ConstraintLayout 中包含的小部件使用 MATCH _ PARENT。类似的行为可以通过使用 MATCH _ CONSTRINT 来定义,并将相应的 left/right 或 top/bottom 约束设置为“ father”

您可以检查您的适配器。

 1 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);
2 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);

I had a same problem like you when I used 1. You can try 2.

如果希望 TextView 位于父节点的中央. 。
Your main layout is Constraint Layout

<androidx.appcompat.widget.AppCompatTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/logout"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:gravity="center">
</androidx.appcompat.widget.AppCompatTextView>