我在kotlin中尝试了android的两种方式的数据绑定,但似乎无法正常工作。我有2个EditText,它们每个都应更新另一个EditText。
例如:
当我在EditText1中输入“测试”时,EditText2应该使用EditText1加上后缀(e.g. TestSUFFIX)
的值进行更新,反之亦然。
这些是我的TextViews
<androidx.appcompat.widget.AppCompatEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={convertermodel.valueFrom}" />
<androidx.appcompat.widget.AppCompatEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={convertermodel.valueTo}" />
这是我的ViewModel
class ConverterModel : BaseObservable() {
@Bindable
var valueFrom: String? = null
get() {
return valueTo + "SUFFIX"
}
set(param) {
field = param
notifyPropertyChanged(BR.valueFrom)
}
@Bindable
var valueTo: String? = null
get() {
return valueFrom + "SUFFIX"
}
set(param) {
field = param
notifyPropertyChanged(BR.valueTo)
}
}
这将导致无限循环。我该如何预防?
答案 0 :(得分:0)
您的问题根本与数据出价无关。您的实现会导致对getter的递归调用: valueFrom.get()将调用valueTo.get(),然后将再次调用valueFrom.get()-> StackOverflowError。
您必须使用kotlin支持属性,例如:
class AccessTest {
var _valueTo: String? = null
var _valueFrom: String? = null
var valueFrom: String? = null
get() {
return _valueTo + "SUFFIX"
}
set(param) {
field = param
_valueFrom = param
}
var valueTo: String? = null
get() {
return _valueFrom + "SUFFIX"
}
set(param) {
field = param
_valueTo = param
}
@Test
fun testAccess() {
valueTo= "valueTo"
valueFrom= "valueFrom"
print(valueTo)
}
}
答案 1 :(得分:0)
您需要检查设置器的值是否相同,然后不要再次设置:
class ConverterModel : BaseObservable() {
@Bindable
var valueFrom: String? = null
get() {
return valueTo + "SUFFIX"
}
set(param) {
if (field == param) return
field = param
notifyPropertyChanged(BR.valueFrom)
}
@Bindable
var valueTo: String? = null
get() {
return valueFrom + "SUFFIX"
}
set(param) {
if (field == param) return
field = param
notifyPropertyChanged(BR.valueTo)
}
}