2

我正在设置我的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

4

2 回答 2

1

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

于 2019-07-17T04:03:44.450 回答
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}"
于 2019-07-17T05:35:46.700 回答