首页 > 解决方案 > 如何使数据绑定与 xml 属性一起工作?

问题描述

我正在设置我的EdittextCheckBox与我的视图模型挂钩。我已经在我的 ViewModel 上设置了变量,isActive并且currentValue我想将它们的值初始化为 xml,以便当用户到达 Fragment 时,当前值也设置为表单字段。

我已经尝试添加android:checked="@{viewModel.isActive}"CheckBoxandroid: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并更新了isActiveandcurrentValue时,它也会反映在 xml.xml 中。我认为到目前为止的实际输出对于currentValueisActive

标签: androidviewmodelandroid-databindingandroid-livedatamutablelivedata

解决方案


似乎我忘记将 LifecycleOwner 设置为数据绑定。binding.setLifecycleOwner(this)我已经在我的 Fragment 上修复了它。


推荐阅读