Android数据绑定-找不到<;的getter&燃气轮机;接受参数类型';长';
在过去的几周里,我一直在使用数据绑定,现在我正在尝试对具有“value”属性的自定义视图使用双向数据绑定 我的问题是在构建时出现以下错误 找不到接受参数类型“long”的getter 现在我的理解是绑定库将自动使用我的公共setter和getter,但是最令人困惑的是添加一个冗余的反向绑定适配器似乎可以解决这个问题?所以我得到的印象是,它正在使用我的setter,而不需要适配器,但getter不是这样吗 我的自定义视图Android数据绑定-找不到<;的getter&燃气轮机;接受参数类型';长';,android,kotlin,android-custom-view,android-databinding,android-binding-adapter,Android,Kotlin,Android Custom View,Android Databinding,Android Binding Adapter,在过去的几周里,我一直在使用数据绑定,现在我正在尝试对具有“value”属性的自定义视图使用双向数据绑定 我的问题是在构建时出现以下错误 找不到接受参数类型“long”的getter 现在我的理解是绑定库将自动使用我的公共setter和getter,但是最令人困惑的是添加一个冗余的反向绑定适配器似乎可以解决这个问题?所以我得到的印象是,它正在使用我的setter,而不需要适配器,但getter不是这样吗 我的自定义视图 class DraglineView(context: Context, a
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()
}
}
问题是数据绑定系统不知道视图何时更改值 它不仅描述了如何从视图中检索值,还定义了一个可选属性,该属性将接收一个实例。默认事件名称是后缀为“AttrChanged”的属性名称
现在让我们看看您的
setDraglineListener()
适配器。它处理由InverseBindingAdapter
添加的valueAttrChanged
属性,并接收InverseBindingListener
。唯一剩下的就是调用listener.onChange()
,在值更改时通知侦听器 谢谢你的回答,但我认为它不能完全回答我的问题。我真正想知道的是为什么首先需要一个反向绑定适配器?尤其是在没有适配器的情况下使用setter似乎没有问题,那么为什么它需要一个getter呢?谢谢你的帮助。@HenryTwist对不起,我没有正确理解你的问题。我更新了我的答案,希望它现在能帮助你。如果您还有任何问题,请随时提问。对不起,如果我不清楚,我原始问题中的所有代码都工作正常,并产生我期望的结果。我所困惑的是数据绑定库生成代码的方式。为了使双向绑定能够工作,我假设它必须能够访问setter、getter,并以某种方式知道值何时更改(侦听器)。但是,绑定工作时没有为setter提供绑定适配器,这意味着它必须自动使用匹配的setter。所以为什么它不能用getter也这样做呢。谢谢你的耐心!谢谢你的帮助@ValeriyKatkov,我想我只是不明白为什么生成二传手没有问题,但不能为获得者做同样的事情!适配器绑定到特定的视图类型,而不仅仅是属性名称。所以不要担心,对于不同的视图使用相同的属性名称是可以的。