过去几周我一直在使用数据绑定,现在正尝试对具有'value'属性的自定义视图使用双向数据绑定。
我的问题是在构建时出现以下错误。
找不到
接受参数类型'long'
现在,我的理解是绑定库将自动使用我的公共setter和getter,但是最令人困惑的部分是添加冗余的反向绑定适配器似乎可以解决问题?因此,我得到的印象是它使用我的setter而不需要适配器,但是getter并非如此?
[如果有人可以对此有所了解,或者说在这种情况下通常是如何进行绑定的,那么将不胜感激。这是我的相关代码,请问您是否有任何问题!
我的自定义视图
class DraglineView(context: Context, attrs: AttributeSet) : View(context, attrs) {
...
var value = 0L
set(value) {
draggedValue = value
field = value
invalidate()
}
...
}
我在布局文件中的视图
<com.twisthenry8gmail.dragline.DraglineView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:increment="@{viewmodel.type.minIncrement}"
app:minValue="@{viewmodel.type.minIncrement}"
app:value="@={viewmodel.target}" />
我看似冗余的适配器
@InverseBindingAdapter(attribute = "value")
@JvmStatic
fun getValueTest(draglineView: DraglineView): Long {
return draglineView.value
}
我的属性已更改适配器
@BindingAdapter("valueAttrChanged")
@JvmStatic
fun setDraglineListener(draglineView: DraglineView, listener: InverseBindingListener) {
draglineView.valueChangedListener = {
listener.onChange()
}
}
我试图创建相同的组件+双向绑定示例,并且编译时没有错误。这是我的版本:
class DraglineView(context: Context, attrs: AttributeSet) : View(context, attrs) {
var value = 0L
}
@InverseBindingAdapter(attribute = "value")
fun getDraglineViewValue(view: DraglineView) = view.value
@BindingAdapter( "valueAttrChanged")
fun setDraglineViewListeners(view: DraglineView, listener: InverseBindingListener) {}
...
<com.icesmith.sliderdatabinding.DraglineView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:value="@={model.draglineViewValue}"/>
...
我有一个repo,其中包含重要的Slider数据绑定示例。只需将上面的代码添加到MainActivity.kt和activity_main.xml。它可以工作,可能取决于项目设置。
我只是answered另一个类似的问题,希望您可以在此处找到一些有用的信息。