У меня есть 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">
Итак, я получаю эту ошибку
«Не удается найти установщик для <android.widget.LinearLayout setVerticalBias>, который принимает тип параметра «плавающий». Если адаптер привязки предоставляет установщик, проверьте правильность аннотации адаптера и соответствие типа параметра. Открыть файл"
В чем проблема, не могу найти!
setVerticalBias
устанавливается на LinearLayout, а не на ConstraintLayout, даже если смещение используется ConstraintLayout. Измените адаптер привязки на следующий:
@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)
}
@EmreTekin Это атрибут ConstraintLayout (его использует ConstraintLayout), но он определяется с дочерними элементами ConstraintLayout, такими как ваш LinearLayout.
Так работает, спасибо, сначала не знаю почему, но я думал, что это атрибут limitedlayout :)