Маржа не работает на стороне без каких-либо ограничений в ConstraintLayout - PullRequest
0 голосов
/ 10 октября 2019

У меня есть ImageView в ConstraintLayout с идентификатором «thumbnail» в XML ниже. Я хочу, чтобы он был выровнен по левому верхнему краю от своего родителя и имел маржу 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>

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Вы можете использовать нижний отступ в родительском ConstraintLayout вместо нижнего поля в ImageView. Это самое простое решение, которое я нахожу.

Есть еще одно решение, которое я использую в этих ситуациях. Я вручную устанавливаю нижнюю границу ограничения с нижним полем для дочернего представления, когда я знаю, что макет родительского ограничения будет уменьшаться.

Вы можете программно добавить новые ограничения, выполнив следующие действия:

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

0 голосов
/ 10 октября 2019

Ограничение ImageView к нижней части родительского элемента, а также к верхней части родительского элемента будет центрировать виджет сверху вниз , если вертикальное смещение равно 0,5, значение по умолчанию. Если вертикальное смещение установлено на 0, то виджет будет прижиматься к вершине ConstraintLayout независимо от его высоты и будет поддерживать свое нижнее поле при свертывании макета.

Добавьте следующее в XML для Миниатюра :

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