Как я могу изменить ConstraintLayout verticalBias в соответствии со значением viewState

У меня есть 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>, который принимает тип параметра «плавающий». Если адаптер привязки предоставляет установщик, проверьте правильность аннотации адаптера и соответствие типа параметра. Открыть файл"

В чем проблема, не могу найти!

0
0
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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)
}

Так работает, спасибо, сначала не знаю почему, но я думал, что это атрибут limitedlayout :)

Emre Tekin 22.03.2022 14:53

@EmreTekin Это атрибут ConstraintLayout (его использует ConstraintLayout), но он определяется с дочерними элементами ConstraintLayout, такими как ваш LinearLayout.

Cheticamp 22.03.2022 15:40

Другие вопросы по теме