Kotlin CustomView 2路数据绑定

问题描述 投票:0回答:1

我有1个自定义视图,包含:TextView - > label; EditText - >输入; 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”我可以从我的customview预先填充我的edittext。如果我点击提交按钮,我可以获得键入的任何新值(在我的视图模型中使用我的observablefield获取新值)

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

任何帮助/线索?谢谢

data-binding kotlin 2-way-object-databinding
1个回答
0
投票

虽然你说旋转屏幕后一切都清除了,但你似乎只是在onCreate中创建模型对象。

model = ModelClass()

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

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

但是为此你的ModelClass必须扩展ViewModel类并且有空的构造函数。

当然,你可以使用onSaveInstanceState method to save models state,但对我来说ViewModel更好。

附:说“模型”我的意思是你的布局xml中称为login的对象,它包含接口的数据。

© www.soinside.com 2019 - 2024. All rights reserved.