Kotlin CustomView 2 向数据绑定

Kotlin CustomView 2-way databinding

我有 1 个自定义视图,其中包含:TextView -> label;编辑文本 -> 输入 ; TextView -> 错误信息

我使用自定义属性在我的自定义视图中的 EditText 上设置了所需的文本

我的绑定适配器看起来像:

@InverseBindingMethods(InverseBindingMethod(type = CustImp::class,attribute = "customtext"))
class BindingAdapters {
    companion object {
        @JvmStatic
        @BindingAdapter("customtext")
        fun settextulmeui(editText: CustImp, text: String?) {
            text?.let {
                if (it != editText.nInput.text.toString()) {
                    editText.nInput.setText(it)
                }
            }
        }

        @JvmStatic
        @BindingAdapter(value = ["customtextAttrChanged"], requireAll = false)
        fun setListener(editText: CustImp, listener: InverseBindingListener?) {
            if (listener != null) {
                editText.nInput.addTextChangedListener(object : TextWatcher {
                    override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {

                    }

                    override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {

                    }

                    override fun afterTextChanged(editable: Editable) {
                        listener.onChange()
                    }
                })
            }
        }

        @JvmStatic
        @InverseBindingAdapter(attribute = "customtext")
        fun gettextulmeui(nMe: CustImp): String {
            return nMe.nInput.text.toString()
        }
    }
}

在我的布局中使用:

    <CustImp
        android:id="@+id/mTest"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:customtext="@={login.mytext}"
              />

使用我的 observablefield "mytext" 我可以从我的自定义视图中预填充我的编辑文本。如果我点击提交按钮,我可以获得任何键入的新值(使用我的视图模型中的 observablefield 获取新值)

但是:如果我旋转屏幕,我会丢失所有数据;

有help/clue吗? 谢谢

虽然您说旋转屏幕后一切都会清除,但您似乎只是在 onCreate.

中创建模型对象
model = ModelClass()

相反,您应该使用 ViewModelProviders 来获取可能存在的实例。

protected fun onCreate(savedInstanceState: Bundle) {
    ...
    model = ViewModelProviders.of(this).get(ModelClass::class.java);
    //"this" must be Activity reference
}

但是为此,您的 ModelClass 必须扩展 ViewModel class 并且具有空构造函数。

当然可以用onSaveInstanceState method to save models state,不过对我来说ViewModel更好

P.S。说 "model" 我的意思是您的布局 xml 中名为 login 的对象,它包含接口数据。