我正在设置Edittext
和CheckBox
以与我的视图模型挂钩。我已经在ViewModel上设置了变量isActive
和currentValue
,并且想将它们的值初始化为xml,以便当用户到达Fragment时,当前值也设置为表单字段。
我已经尝试将android:checked="@{viewModel.isActive}"
添加到CheckBox
,并将android:text="@{viewModel.currentValue}"
添加到EditText
,但是没有任何结果。
现在,我的解决方法是通过Fragment初始化表单字段值:
viewModel.isActive.observe(this, Observer {
it?.let {
binding.checkBox.isChecked = it
}
})
viewModel.currentValue.observe(this, Observer {
it?.let {
binding.editText.setText(it.toString())
}
})
这是我的代码:
ViewModel.kt
val isActive = Transformations.map(currentEntity) {
it.value?.isActive == 1
}
val currentValue = Transformations.map(currentEntity) {
it.value?.currentValue
}
private var currentEntity = MutableLiveData<Entity?>()
init {
initializeCurrentEntity()
}
private fun initializeCurrentEntity() {
uiScope.launch {
currentEntity.value = getCurrentEntityById(id)
}
}
layout.xml
<layout ...>
<data>
<variable name="viewModel"
type="com.example.app.ViewModel"/>
</data>
...
<com.google.android.material.textfield.TextInputLayout ... >
<com.google.android.material.textfield.TextInputEditText
...
android:text="@{viewModel.currentValue}"
...
/>
</com.google.android.material.textfield.TextInputLayout>
...
<CheckBox
...
android:checked="@{viewModel.isActive}" />
</layout>
我想要的结果是,当viewModel
已经初始化currentEntity
并更新了isActive
和currentValue
时,它也将反映在xml中。我认为currentValue
和isActive
的实际输出到目前为止都是空的
答案 0 :(得分:1)
似乎我忘记了将LifecycleOwner设置为数据绑定。我已经在片段上用binding.setLifecycleOwner(this)
修复了它。
答案 1 :(得分:1)
您做错了两次相同的事情。
这是您拥有的两个选项。 仅执行其中一项。
选项1:绑定viewModel和数据绑定将自动观察它
<layout ...>
<data>
<variable name="viewModel"
type="com.example.app.ViewModel"/>
</data>
...
<com.google.android.material.textfield.TextInputLayout ... >
<com.google.android.material.textfield.TextInputEditText
...
android:text="@{viewModel.currentValue}"
...
/>
</com.google.android.material.textfield.TextInputLayout>
...
<CheckBox
...
android:checked="@{viewModel.isActive}" />
</layout>
您需要将viewModel传递给绑定:
binding.viewModel = authenticationViewModel
也不要忘记设置生命周期所有者:
binding.lifecycleOwner = this
如果您要选择此选项,请从代码中删除以下行:
viewModel.isActive.observe(this, Observer {
it?.let {
binding.checkBox.isChecked = it
}
})
viewModel.currentValue.observe(this, Observer {
it?.let {
binding.editText.setText(it.toString())
}
})
选项2:手动观察者实时数据
viewModel.isActive.observe(this, Observer {
it?.let {
binding.checkBox.isChecked = it
}
})
viewModel.currentValue.observe(this, Observer {
it?.let {
binding.editText.setText(it.toString())
}
})
如果要选择此选项,请从xml中删除以下行:
<data>
<variable name="viewModel"
type="com.example.app.ViewModel"/>
</data>
和
android:checked="@{viewModel.isActive}"
和
android:text="@{viewModel.currentValue}"