如何根据 viewState 值更改 ConstraintLayout verticalBias

How Can I change ConstraintLayout verticalBias according to viewState value

我有类似的 BindingAdapter;

@JvmStatic
@BindingAdapter("setVerticalBias")
fun ConstraintLayout.setVerticalBias(value: Float?) {
    val cs = ConstraintSet()
    cs.setVerticalBias(R.id.llResultContent, value ?: 0.1f)
    cs.applyTo(this)
}

我的 viewState 中有一个条件,它管理浮点值,例如;

val constraintBias: Float
    get() {
        return if (hasSecondaryActions) {
            0.1f
        } else {
            0.8f
        }
    }

然后我将它与我的绑定适配器一起使用,例如;

 <LinearLayout
        android:id="@+id/llResultContent"
        setVerticalBias="@{viewState.constraintBias}"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

所以我收到了这个错误

“找不到接受参数类型 'float' 的 的 setter 如果绑定适配器提供 setter,请检查适配器是否正确注释以及参数类型是否匹配。 打开文件

这里有什么问题我找不到!

setVerticalBias 是在 LinearLayout 而不是 ConstraintLayout 上设置的,即使 [=17= 使用了偏置]约束布局。将您的绑定适配器更改为以下内容:

@JvmStatic
@BindingAdapter("setVerticalBias")
fun LinearLayout.setVerticalBias(value: Float?) {
    val constraintLayout = (this.parent as ConstraintLayout)
    val cs = ConstraintSet()
    cs.clone(constraintLayout)
    cs.setVerticalBias(R.id.llResultContent, value ?: 0.1f)
    cs.applyTo(constraintLayout)
}

或者,更一般地说:

@JvmStatic
@BindingAdapter("setVerticalBias")
fun LinearLayout.setVerticalBias(value: Float?) {
    val constraintLayout = (this.parent as ConstraintLayout)
    val cs = ConstraintSet()
    cs.clone(constraintLayout)
    cs.setVerticalBias(this.id, value ?: 0.1f)
    cs.applyTo(constraintLayout)
}