如何使数据绑定与 xml 属性一起工作?

How to make data binding work with xml attributes?

我正在设置我的 EdittextCheckBox 以连接我的视图模型。我已经在我的 ViewModel 上设置了变量 isActivecurrentValue,我想将它们的值初始化为 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 并更新了 isActivecurrentValue 时,它也会反映在 xml。我认为 currentValueisActive

的实际输出现在都是空的

我好像忘了给数据绑定设置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}"