如何使数据绑定与 xml 属性一起工作?
How to make data binding work with xml attributes?
我正在设置我的 Edittext
和 CheckBox
以连接我的视图模型。我已经在我的 ViewModel 上设置了变量 isActive
和 currentValue
,我想将它们的值初始化为 xml 以便当用户到达 Fragment 时,当前值为也设置为表单字段。
我已经尝试将 android:checked="@{viewModel.isActive}"
添加到 CheckBox
,并将 android:text="@{viewModel.currentValue}"
添加到 EditText
,但是它没有产生任何结果。
现在,我的解决方法是通过片段初始化表单字段值:
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
的实际输出现在都是空的
我好像忘了给数据绑定设置LifecycleOwner。我已经在我的 Fragment 上用 binding.setLifecycleOwner(this)
修复了它。
你以错误的方式做了两次同样的事情。
这是您的两个选择。 只做其中一项。
Option1: bind viewModel and databinding will automatically observe it
<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())
}
})
Option2: manually observer live data
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}"
我正在设置我的 Edittext
和 CheckBox
以连接我的视图模型。我已经在我的 ViewModel 上设置了变量 isActive
和 currentValue
,我想将它们的值初始化为 xml 以便当用户到达 Fragment 时,当前值为也设置为表单字段。
我已经尝试将 android:checked="@{viewModel.isActive}"
添加到 CheckBox
,并将 android:text="@{viewModel.currentValue}"
添加到 EditText
,但是它没有产生任何结果。
现在,我的解决方法是通过片段初始化表单字段值:
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
我好像忘了给数据绑定设置LifecycleOwner。我已经在我的 Fragment 上用 binding.setLifecycleOwner(this)
修复了它。
你以错误的方式做了两次同样的事情。
这是您的两个选择。 只做其中一项。
Option1: bind viewModel and databinding will automatically observe it
<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())
}
})
Option2: manually observer live data
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}"