在ConstraintLayout中设置宽度以匹配约束条件

123

我希望将一个View的左右两侧限制在其父View的边距内,并使其填充分配的空间。然而,将宽度设置为match_parentwrap_content似乎会产生相同的结果。

是否有与match_constraints(而不是match_parent和wrap_content)等效的选项?match_parentwrap_content是否影响布局,或在新的约束布局中被忽略了?


1
为什么match_parent对你不起作用? - Eugen Martynov
10个回答

194

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

9
Android团队应该让"match_parent"正常工作。这将非常简单。只需使match_parent提供与应用程序被约束到父级开头和结尾相同的功能即可。垂直或水平方向的检测都很容易。 - bharv14
但是0dp不会导致双倍测量吗? - Pramod Garg

160

match_parent 不被支持,所以请使用 android:layout_width="0dp"。 使用 0dp,你可以把你的限制条件理解为“可扩展”的而不是“填充剩余空间”的。

此外,0dp 可以通过一个位置定义,而 match_parent 则依赖于其父元素来确定它的位置(x、y 坐标和宽度、高度)。


37
为什么这个答案被接受了?!“match_parent”在约束布局中不被支持,而这个答案没有提供实现的方法。 - Daniele Segato
3
不支持 match_parent。 - Nicolas Roard
12
这个答案是正确的。它清楚地说明了不支持match_parent。另外,为了实现'match_parent'设置的合理替代方案,可以将0dp设置为父级左右两侧的约束条件(边距为0或选择适合的边距),可以得到同样的结果。这个答案真正遗漏的是需要在两侧设置约束条件(或者对于垂直方向,需要在上下两端设置),这也是Arieck的答案中提到的。这是我使用的方法,我没有遇到任何问题。此外,当与其他组件一起使用时,它的工作方式就像权重设置一样。 - Eric Engel
1
如果有人来这里寻求答案,为什么它不起作用。看起来它在测试版中出了问题。在1.0.2中似乎可以工作。教训是 - 冻结库,不要使用机会主义更新。 - inteist
1
@Tequilaman的评论可能就是答案。他正确地指出了实现方法。 在两侧创建0dp边距的约束条件,这就可以解决问题了。 - Utkarsh Mankad

32

显然,match_parent在直接位于ConstraintLayout下的视图上使用不可行,但可以在嵌套在直接位于ConstraintLayout下的视图中使用。

因此,如果您需要将您的视图作为match_parent来使用,则:

  1. 应该使用0dp来设置ConstraintLayout直接子元素
  2. 嵌套的元素(例如,孙子元素到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>

你的示例中,将TextInputLayout更改为ConstraintLayout,那么在一个ConstraintLayout中嵌套另一个ConstraintLayout怎么样? - superuser
然后这是一个约束布局,同样的规则适用。0dp - Mohsin Falak

19

match_parentConstraintLayout 中不被支持。将宽度设置为 0dp 以使其匹配约束条件。


wrap_content被支持吗? - KG6ZVP
是的,就我所知。 - Marcin Koziński
6
支持wrap_content。 - Romain Guy

18

根据官方文档

重要提示:不建议在 ConstraintLayout 中使用 MATCH_PARENT。可以通过将相应的左/右或上/下约束设置为“parent”并使用 MATCH_CONSTRAINT 来定义类似的行为。

如果您想实现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" />

1
请注意,截至2021年的文档更加强调此点。它不再以“建议”形式表述: https://developer.android.com/training/constraint-layout注意:在ConstraintLayout中,您不能为任何视图使用match_parent。而应该使用“match constraints”(0dp)。 - Carmen

8
您可以检查您的适配器。
 1 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);
 2 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);

当我使用1时,我遇到了和你一样的问题。你可以尝试2。


1
这真是太棒了!谢谢你! - grrigore

3
在办公文档中: https://developer.android.com/reference/android/support/constraint/ConstraintLayout 当将一个维度设置为MATCH_CONSTRAINT时,其默认行为是使结果大小占用所有可用空间。
使用0dp等同于“MATCH_CONSTRAINT”。
重要提示:不建议在ConstraintLayout中包含的小部件中使用MATCH_PARENT。相似的行为可以通过使用MATCH_CONSTRAINT并将相应的左/右或上/下约束设置为“parent”来定义。

3

无法直接将您的视图设置为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"/>

2

将宽度或高度(根据需要匹配父级)设置为0dp,并将左、右、上、下的边距设置为与父级匹配。


-1

如果你想让TextView位于父布局的中心..
你的主要布局是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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接