Связывание ConstraintLayout Ratio имеет ширину, но не высоту - PullRequest
2 голосов
/ 29 апреля 2019

Я пытаюсь динамически установить соотношение 2 ImageView с использованием привязки данных. Если флаг имеет значение true, вторая видимость ImageView (B) устанавливается как пропавшая, а первая (A) должна отображаться в формате 16:9 и расширяться, чтобы заполнить ширину родительского элемента. Если оба вида должны быть видимыми, они должны быть 1:1 и отображаться рядом.

Проблема в том, что левый вид изображения, A, никогда не отображается. С помощью инспектора макета я могу убедиться, что он существует и имеет ширину, но не имеет высоты.

Я что-то упустил? B отображается как ожидалось. Если я вручную установлю коэффициент на A, он будет отображаться правильно.

Моя привязка выглядит так:

@BindingAdapter("imageRatio")
fun setConstraintRatio(view: ImageView, ratio: String) {
    val constraintLayout = view.parent as ConstraintLayout
    val constraintSet = ConstraintSet()
    constraintSet.clone(constraintLayout)
    constraintSet.setDimensionRatio(view.id, ratio)
    constraintLayout.setConstraintSet(constraintSet)
}

Форматер:

val dimensionRatio: String
    get() {
        return if (showB) "1:1"
        else "H,16:9"
    }

Мой макет выглядит следующим образом:

<ImageView
        android:id="@+id/card_image_a"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp" android:scaleType="centerCrop"
        app:imageRatio="@{formatter.dimensionRatio}"
        app:layout_constraintEnd_toStartOf="@id/card_image_b"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/divider"
        android:visibility="visible" />

    <ImageView
        android:id="@+id/card_image_b"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:scaleType="centerCrop"
        app:imageRatio="@{formatter.dimensionRatio}"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/card_image_a"
        app:layout_constraintTop_toBottomOf="@id/divider"
        app:visibleOrGone="@{formatter.showImageB}"
        tools:visibility="visible" />

1 Ответ

2 голосов
/ 30 апреля 2019

После некоторых тестов я понял, что поскольку ваш макет уже выложен, вы должны использовать constraintSet.applyTo(constraintLayout), например, так:

@BindingAdapter("imageRatio")
fun setConstraintRatio(view: ImageView, ratio: String) {
    val constraintLayout = view.parent as ConstraintLayout
    val constraintSet = ConstraintSet()
    constraintSet.clone(constraintLayout)
    constraintSet.setDimensionRatio(view.id, ratio)
    constraintSet.applyTo(constraintLayout)
}

Кроме того, я всегда видел строчную букву DimensionRatio в нижнем регистре (это может быть еще одна проблема, которая будет найдена позже). Так что, на всякий случай, измените свой форматтер:

val dimensionRatio: String
    get() {
        return if (showB) "1:1"
        else "h,16:9"
    }

Надеюсь, что это решит проблему!

...