Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ConstraintLayout比率绑定具有宽度,但不具有高度_Android_Kotlin_Imageview_Android Constraintlayout_Android Databinding - Fatal编程技术网

Android ConstraintLayout比率绑定具有宽度,但不具有高度

Android ConstraintLayout比率绑定具有宽度,但不具有高度,android,kotlin,imageview,android-constraintlayout,android-databinding,Android,Kotlin,Imageview,Android Constraintlayout,Android Databinding,我正在尝试使用数据绑定动态设置2ImageViews的比率。如果标志为true,则第二个ImageView的(B)可见性设置为gone,第一个(a)应以16:9格式显示,并展开以填充父视图的宽度。如果两个视图都应该是可见的,则它们应该是1:1,并排显示 问题是,左侧图像视图A永远不会显示。使用布局检查器,我可以验证它是否存在,是否有宽度,但没有高度 我错过什么了吗?B按预期显示。如果我手动设置A上的比率,它会正确显示 我的装订看起来像这样: @BindingAdapter("imageRatio

我正在尝试使用数据绑定动态设置2
ImageView
s的比率。如果标志为true,则第二个
ImageView
的(B)可见性设置为gone,第一个(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" />

经过一些测试,我意识到由于布局已经布置好,所以应该使用
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)
}
另外,我一直认为
尺寸比
方向字母是小写的(可能是稍后会发现的另一个问题)。因此,为了以防万一,请更改格式化程序:

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

希望这能解决问题

日志里有什么有趣的东西吗?另外,可能太明显了,但必须问:是否调用了
imageRatio
BindingAdapter
?好问题,如果我设置了断点,我确实看到每个视图调用了
imageRatio
。我也没有在日志中看到任何值得注意的东西。是的,这似乎起到了作用。非常感谢你!代码看起来是可互换的,但显然不是。。。我快要发疯了:)很高兴它帮了我的忙!