设置宽度以匹配 ConstraintLayout 中的约束

Set width to match constraints in ConstraintLayout

我想将视图的左侧和右侧限制在其父视图的边距内,并使其填充分配的 space。但是,将宽度设置为 match_parentwrap_content 似乎会产生相同的结果。

是否有等同于 match_constraints 的东西(相对于 match_parent 和 wrap_content)? match_parentwrap_content 会影响布局还是会在新约束布局中被忽略?

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

不支持

match_parent,所以使用android:layout_width="0dp"。使用 0dp,您可以将约束视为 'scalable' 而不是 'filling whats left'。

此外,0dp 可以由位置定义,其中 match_parent 依赖于它的父位置(x、y 和宽度、高度)

match_parent 是不允许的。但是你实际上可以将宽度和高度设置为 0dp,并将顶部和底部或左右约束设置为 "parent"。

例如,如果你想对元素的宽度进行 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
  • 下的视图
  • OK 对于嵌套在直接位于 ConstraintLayout
  • 下的视图中的视图

因此,如果您需要您的观点发挥 match_parent 的作用,那么:

  1. ConstraintLayout 的直接子代 应该使用 0dp
  2. 嵌套元素 (eg, grandchild to ConstraintLayout) 可以使用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_parent,但我们可以用一些不同的方式来实现,但不要忘记将 Left 和 Right 属性与 Start 和 End 一起使用,因为如果你使用 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"/>

来自official doc

Important: MATCH_PARENT is not recommended for widgets contained in a 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" />

在办公室文档中: https://developer.android.com/reference/android/support/constraint/ConstraintLayout

当维度设置为 MATCH_CONSTRAINT 时,默认行为是让生成的大小占用所有可用的 space。

使用 0dp,相当于 "MATCH_CONSTRAINT"

重要提示:不建议将 MATCH_PARENT 用于 ConstraintLayout 中包含的小部件。可以通过使用 MATCH_CONSTRAINT 将相应的 left/right 或 top/bottom 约束设置为 "parent"

来定义类似的行为

您可以检查您的适配器。

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

我用1的时候遇到了和你一样的问题。 你可以试试2.

如果你想让 TextView 位于父元素的中心..
您的主要布局是约束布局

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