ConstraintLayout Ratio绑定具有宽度但不具有高度

时间:2019-04-29 20:24:48

标签: android kotlin imageview android-constraintlayout android-databinding

我正在尝试使用数据绑定来动态设置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 个答案:

答案 0 :(得分:2)

经过一些测试,我意识到由于您的布局已经布局,因此您应该使用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"
    }

希望这可以解决问题!