Kotlin-具有2 EditText的双向数据绑定

时间:2019-10-23 13:22:54

标签: android kotlin

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

这将导致无限循环。我该如何预防?

2 个答案:

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