Android двусторонняя привязка данных в пользовательском представлении. Не могу найти геттер - PullRequest
0 голосов
/ 02 ноября 2019

Я реализую двустороннюю привязку данных в пользовательском представлении. Я следовал за официальными разработчиками Android , но все еще не могу заставить его работать. У меня есть ручка, которая управляет целочисленным значением внутри свойства value.

class ControlKnob(context: Context, attributeSet : android.util.AttributeSet) : RelativeLayout(context, attributeSet), IUIControl {
    companion object {
        @JvmStatic
        @BindingAdapter("value")
        fun setValue(knob : ControlKnob, value : Int) {
            if(knob.value != value) {
                knob.value = value
            }

        }

        @JvmStatic
        @InverseBindingAdapter(attribute = "value")
        fun getValue(knob : ControlKnob) : Int {
            return knob.value
        }

        @JvmStatic
        @BindingAdapter("app:valueAttrChanged")
        fun setListeners( knob : ControlKnob, attrChange : InverseBindingListener) {
            knob.setOnProgressChangedListener {
                attrChange.onChange()
            }
        }
    }
    var value : Int = -1
    set(value) {
        field = value
        valueView.text = stringConverter.invoke(value)
    }
....
....
}

Внутри макета я использую его так:

<cz.abc.def.package.controls.ControlKnob
                    android:id="@+id/knob"
                    android:layout_width="100dp"
                    android:layout_height="100dp"
                    android:layout_row="0"
                    android:layout_column="0"
                    app:value="@={viewModel.value}"
                    app:label="Knob" />

И модель моего вида:

@Bindable
fun getValue() : Int {
    return someValue
}

fun setValue(value : Int) {
    someValue = value

}

Но все же я не могу его скомпилировать. Я получаю

Cannot find a getter for cz.abc.def.package.controls.ControlKnob app:value that accepts parameter type 'int'

If a binding adapter provides the getter, check that the adapter is annotated correctly and that the parameter type matches.

Что может быть причиной этого?

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Я понял это. Оказалось, что это не проблема с кодом. Мне не хватало apply plugin: 'kotlin-kapt' в файле сборки Gradle. После того, как я добавил эту строку в build.gradle в модуле, он заработал.

0 голосов
/ 03 ноября 2019

Может быть, ваш адаптер слушателя не так? Согласно документации , значение BindingAdapter прослушивателя событий должно быть "android:valueAttrChanged", и у вас есть "app:valueAttrChanged".

...