【问题标题】:Margin doesn't work on a side without any constraint in ConstraintLayout边距在 ConstraintLayout 中没有任何约束的一侧不起作用
【发布时间】:2019-10-10 07:01:49
【问题描述】:

我在下面的 XML 中的 ConstraintLayout 中有一个 ImageView,其 id 是“thumbnail”。我希望它对齐其父级的左上角并在底部有 8dp 的边距。但是,不应用底部边距,因为那一侧没有限制。我没有将它的底部连接到它的父级,因为它居中,这是我不想要的。

有没有办法解决这个问题?希望在提供底部约束时能够将其与顶部对齐?

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="true">

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/thumbnail"
        android:layout_width="56dp"
        android:layout_height="56dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:scaleType="centerCrop"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/bg_track_artwork" />

    <TextView
        android:id="@+id/title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/margin"
        android:text="Title"
        android:textColor="#040404"
        android:textSize="15sp"
        android:textStyle="bold"
        android:typeface="sans"
        app:firstBaselineToTopHeight="32dp"
        app:layout_constraintBottom_toTopOf="@+id/subtitle"
        app:layout_constraintEnd_toStartOf="@+id/itemMenu"
        app:layout_constraintStart_toEndOf="@+id/thumbnail"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/subtitle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Subtitle"
        android:textSize="10sp"
        app:firstBaselineToTopHeight="20dp"
        app:layout_constraintEnd_toEndOf="@+id/title"
        app:layout_constraintStart_toStartOf="@+id/title"
        app:layout_constraintTop_toBottomOf="@+id/title" />

    <LinearLayout
        android:id="@+id/itemMenu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/quarter_margin"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/title"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/overflowIcon"
            android:layout_width="@dimen/icon_width"
            android:layout_height="@dimen/icon_height"
            android:padding="@dimen/icon_padding"
            app:srcCompat="@drawable/ic_more"
            app:tint="@color/icon_gray_light" />

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

    标签: android android-constraintlayout


    【解决方案1】:

    将 ImageView 约束到父级的底部以及父级的顶部将使小部件从上到下居中如果垂直偏差为 0.5,默认值。如果垂直偏差设置为 0,那么无论它有多高,小部件都将紧贴在 ConstraintLayout 的顶部,并且在布局折叠时将保持其底部边距。

    将以下内容添加到 thumbnail 的 XML 中:

    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintVertical_bias="0"
    

    【讨论】:

      【解决方案2】:

      您可以在父 ConstraintLayout 上使用底部填充,而不是在 ImageView 上使用底部边距。这是我找到的最简单的解决方案。

      在这些情况下,我还使用了另一种解决方案。当我知道父约束布局会缩小时,我在子视图上手动设置约束底部和底部边距。

      您可以通过执行以下操作以编程方式添加新约束

      val constraintSet = ConstraintSet() constraintSet.clone(constraintLayout) constraintSet.connect(R.id.thumbnail, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 8) constraintSet.applyTo(constraintLayout)

      【讨论】:

      • 这实际上是我现在所做的,但想知道是否有不修改父视图的方法。
      • 我更新了我的回复。如果您需要更多详细信息我如何以编程方式添加约束,请询问。
      • 请分享。如果我为“缩略图”的底部定义了一个约束,并且如果标题和副标题是多行,则父级的高度大于“缩略图”并且“缩略图”垂直居中。
      • 嗯这有点棘手,因为如果你想手动设置约束,你必须知道你的标题和副标题何时是多行的。
      猜你喜欢
      • 1970-01-01
      • 2022-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2018-03-16
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多