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


97

我想将视图的左右两侧限制为父视图的边距,并使其填充分配的空间。但是,将width设置为match_parentwrap_content似乎会产生相同的结果。

是否有等同于match_constraints的东西(与match_parent和wrap_content相反)?难道match_parentwrap_content影响布局还是他们在新的约束布局忽略?

为我最喜欢的平台爱上这个新的布局系统!


1
为什么match_parent对您不起作用?
Eugen Martynov

Answers:


120

match_parent不支持。使用0dp,您可以将约束视为“可扩展的”,而不是“填补剩下的”。

同样,0dp可以通过位置定义位置,位置match_parent取决于其位置的父级(x,y和宽度,高度)


31
为什么会接受这个答案?!?约束布局不支持match_parent。而且这个答案无法实现它。
Daniele Segato

3
不支持match_parent。
Nicolas Roard '17

7
这个答案是正确的。明确指出不支持match_parent。此外,要执行合理的替代“ match_parent”设置,将约束设置为左右父母(边界0或选择适合)的0dp将产生相同的结果。在这个答案中(Arieck的答案)真正遗漏的唯一一件事是需要在两侧(或垂直方向的顶部和底部)设置约束。这就是我的操作方式,我没有任何问题。另外,当与其他组件一起使用时,它可以作为重量设置。
龙舌兰酒'17

如果有人来这里寻求答案,那是行不通的。看来它在beta中被打破了。它似乎在1.0.2中工作。获得的经验教训-冻结库,不要使用机会更新。
整数

1
@Tequilaman评论可以作为答案。他正确地指出了实施方法。在两侧以0dp的余量创建约束,就可以了。
Utkarsh Mankad '18

168

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

因此,例如,如果您希望对match_parent元素的宽度进行约束,可以这样进行:

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

4
Android小组应该使“ match_parent”起作用。这将非常容易。简单地使match_parent提供相同的功能,就好像该应用程序被限制为父级的开始和结束一样。易于在垂直或水平方向进行检测。
bharv14 '18

但是0dp不会导致双重测量吗?
Pramod Garg

25

显然match_parent是:

  • 不能直接在下面查看ConstraintLayout
  • 对于嵌套在直接下方的视图内的视图,单击确定ConstraintLayout

因此,如果您需要视图用作match_parent,则:

  1. 直接孩子ConstraintLayout应该使用0dp
  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>

嵌套在ConstraintLayout中的ConstraintLayout怎么样,在您的示例中将TextInputLayout更改为ConstraintLayout?
超级用户


13

官方文档

重要提示:不建议对ConstraintLayout中包含的窗口小部件使用MATCH_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" />

4

您可以检查适配器。

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

使用1时,我也遇到了类似的问题。您可以尝试2。


这是金!谢谢!
grrigore

3

要使您的视图成为match_parent不可能直接实现,但是我们可以通过一些不同的方式来实现,但是不要忘记在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"/>

2

将width或height(您需要与之匹配的父级)设置为0dp,并设置left,right,top,bottom的边距以用作match父级



0

如果要在父级的中心放置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>

0

当滚动视图中有约束布局时,我找到了另一个答案,那么我们需要将

android:fillViewport="true"

到滚动视图

android:layout_height="0dp"

在约束布局中

例:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
        android:fillViewport="true">

    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="0dp">

// Rest of the views

</androidx.constraintlayout.widget.ConstraintLayout>

</ScrollView>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.