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

时间:2019-07-17 03:01:01

标签: android viewmodel android-databinding android-livedata mutablelivedata

我正在设置EdittextCheckBox以与我的视图模型挂钩。我已经在ViewModel上设置了变量isActivecurrentValue,并且想将它们的值初始化为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并更新了isActivecurrentValue时,它也将反映在xml中。我认为currentValueisActive的实际输出到目前为止都是空的

2 个答案:

答案 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}"