ConstraintLayout中的边距行为

15

我对在ConstraintLayout中使用边距(android:layout_margin*)的行为感到困惑。边距似乎只在某些情况下生效,我希望有人能够解释一下(或确认这是一个ConstraintLayout的bug)。

我有以下布局...

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
         android:id="@+id/leftView"
         android:layout_width="0dp"
         android:layout_height="100dp"
         android:layout_marginEnd="20dp"
         android:background="@android:color/holo_blue_dark"
         app:layout_constraintEnd_toStartOf="@+id/rightView"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"/>

     <View
         android:id="@+id/rightView"
         android:layout_width="100dp"
         android:layout_height="100dp"
         android:background="@android:color/holo_green_light"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>

...它会产生以下输出...

Expected Output

然而,当我将边距从leftView更改为rightView时...

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:id="@+id/leftView"
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:background="@android:color/holo_blue_dark"
        app:layout_constraintEnd_toStartOf="@+id/rightView"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <View
        android:id="@+id/rightView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginStart="20dp"
        android:background="@android:color/holo_green_light"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout> 

...边距意外消失了...

Unexpected Output

有人能解释一下这是否是预期行为,如果是的话,为什么会这样?


有点好奇:如果你将 app:layout_constraintEnd_toStartOf="@+id/rightView" 添加到 rightView,同时保留 app:layout_constraintStart_toEndOf="@+id/leftView",会发生什么呢? - stkent
@stkent 几乎与第二种情况相同的行为。但在这种情况下,LeftView 填满整个屏幕宽度,除非将 LayoutWidth 设置为某个值,如 100dp。我也不理解这种行为。 - Ajil O.
3个回答

14

由于leftview取决于rightview,因此您可以将leftview的margin设置为rightview

当一个视图有margin时,它意味着这个视图给依赖它的视图留出空间。

如果您在rightview中编写android:layout_marginStart="20dp",它不会给leftview留出空间,因为rightview不依赖leftview


1
谢谢。这可能是对问题最清晰、最简洁的解释了。 - Gus
然而,它并不是非常直观的。我有一个视图,我想将其边距设置为20dp,但底部边距没有应用,因为下面的对象有一个约束条件,必须在该视图下方定位。在使用constraintLayout之前,假设边距是视图空间的一部分是很自然的。 - htafoya

0

由于rightView依赖于其父级(ConstraintLayout),因此您需要进行以下设置:

app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"

parentConstraintLayout。你已经做到了让 rightView 在其父级(ConstraintLayout) 的右上角。

所以你在 rightView 中使用了 android:layout_marginStart="20dp"。这样,rightView 将会与其父级(ConstraintLayout) 左边有 20dp 的间距。因此,在这种情况下没有空白间隙。


第二种情况与第一种情况不同。看一下 leftViewleftView 总是位于 rightView 的左侧,因为您在 leftView 中使用了 app:layout_constraintEnd_toStartOf="@+id/rightView" 并且 leftView 还依赖于其父级(ConstraintLayout),因为您在 leftView 中使用了以下代码。
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"

而且你在leftView中使用了android:layout_marginEnd="20dp",这意味着leftView将与rightView右侧有20dp的空白间隔。因此,在这种情况下会出现空白间隔。


你可以尝试使用 app:layout_constraintEnd_toEndOf="parent" 来对 leftView 进行布局,你会看到不同的效果。


0
为了获得您想要的结果,您需要构建一个“链”。只有当链中所有组件之间的链接都被定义时,该链才被正确定义。
在您的代码中,必须将“rightView”连接到“leftView”。请向“rightView”添加以下约束条件。
app:layout_constraintLeft_toRightOf="@+id/leftView"

并将 leftView 中现有的 layout_constraintEnd_toStartOf 约束更改为

app:layout_constraintRight_toLefttOf="@+id/rightView"

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