【问题标题】:ConstraintLayout Ratio binding has width but not heightConstraintLayout Ratio 绑定有宽度但没有高度
【发布时间】:2019-09-18 11:47:49
【问题描述】:

我正在尝试使用数据绑定动态设置 2 ImageViews 的比率。如果标志为真,则第二个 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" />

【问题讨论】:

  • 日志中有什么有趣的事情吗?另外,可能太明显了,但不得不问:imageRatio 的 BindingAdapter 是否被调用?
  • 好问题,如果我设置一个断点,我确实看到每个视图都调用了imageRatio。我也没有在日志中看到任何值得注意的内容。

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


【解决方案1】:

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

希望这能解决问题!

【讨论】:

  • 是的,这似乎成功了。太感谢了!代码看似可以互换,但显然不是……我要疯了:)
  • 很高兴它有帮助!
猜你喜欢
  • 2013-09-15
  • 2021-06-30
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
相关资源
最近更新 更多