ConstraintLayout Ratio 绑定有宽度但没有高度
ConstraintLayout Ratio binding has width but not height
我正在尝试使用数据绑定动态设置 2 ImageView
的比率。如果标志为真,则第二个 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" />
经过一些测试,我发现您的布局已经布置好,您应该使用 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"
}
希望这能解决问题![=14=]
我正在尝试使用数据绑定动态设置 2 ImageView
的比率。如果标志为真,则第二个 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" />
经过一些测试,我发现您的布局已经布置好,您应该使用 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"
}
希望这能解决问题![=14=]