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
的对象,它包含接口数据。
我有 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
的对象,它包含接口数据。