将可观察字段绑定到动态创建的视图
Binding observable field to dynamically created view
我有一个有趣的问题。
在我的代码中,我动态创建了一些 RadioButtons 并将其添加到 RadioGroup。但是我无法理解如何使用 mvvm 和数据绑定以编程方式向每个 RadioButtons 添加可观察的布尔值,但不使用 xml...
因此,例如,如果我们在 xml static 中有 RadioButtons,我们就有这样的东西:
<RadioButton
android:id="@+id/someRadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="@{viewModel.isChecked}"
android:text="@string/some_string" />
和
ObservableBoolean isChecked = new ObservableBoolean(false);
在我们的代码中。
但是,如果 xml 中没有按钮,而是在代码中添加,我们如何添加可观察字段?喜欢
RadioButton radioButton = new RadioButton(this)
radioButton.text = localeLanguage.languageName
RadioGroup.LayoutParams params = RadioGroup.LayoutParams(RadioGroup.LayoutParams.MATCH_PARENT, RadioGroup.LayoutParams.MATCH_PARENT)
radioButton.layoutParams = params
return radioButton
参见official doc。您通过 xxxBinding = DataBindingUtil.inflate(layoutInflater, R.layout.xxx, viewGroup, false);
获得 xxxBinding,然后 xxxBinding.checked = isCheked
.
您可以使用LiveData显示如下:
ViewModel {
val _radioCheckedLiveData = MutableLiveData<Boolean>()
val radioCheckedLiveData: LiveData<Boolean> = _radioCheckedLiveData
private fun setRadioChecked(checked: Boolean) = _radioCheckedLiveData.value = checked
// handle radio check event
fun radioChecked(checked: Boolean) {
if (checked) {
// do something and change the data source
}
fun xxxFun() {
// if you want to change radioButton check status by code, no need to set RadioButton's status directly
setRadioChecked(true)
}
}
}
Activity {
val radioButton = RadioButton(context)
viewModel.radioCheckedLiveData.observe(this) {checked->
radioButton.checked = checked == true
}
radioButton.setOnCheckedListener {checked->
viewModel.radioChecked(checked)
}
}
我有一个有趣的问题。 在我的代码中,我动态创建了一些 RadioButtons 并将其添加到 RadioGroup。但是我无法理解如何使用 mvvm 和数据绑定以编程方式向每个 RadioButtons 添加可观察的布尔值,但不使用 xml... 因此,例如,如果我们在 xml static 中有 RadioButtons,我们就有这样的东西:
<RadioButton
android:id="@+id/someRadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="@{viewModel.isChecked}"
android:text="@string/some_string" />
和
ObservableBoolean isChecked = new ObservableBoolean(false);
在我们的代码中。 但是,如果 xml 中没有按钮,而是在代码中添加,我们如何添加可观察字段?喜欢
RadioButton radioButton = new RadioButton(this)
radioButton.text = localeLanguage.languageName
RadioGroup.LayoutParams params = RadioGroup.LayoutParams(RadioGroup.LayoutParams.MATCH_PARENT, RadioGroup.LayoutParams.MATCH_PARENT)
radioButton.layoutParams = params
return radioButton
参见official doc。您通过 xxxBinding = DataBindingUtil.inflate(layoutInflater, R.layout.xxx, viewGroup, false);
获得 xxxBinding,然后 xxxBinding.checked = isCheked
.
您可以使用LiveData显示如下:
ViewModel {
val _radioCheckedLiveData = MutableLiveData<Boolean>()
val radioCheckedLiveData: LiveData<Boolean> = _radioCheckedLiveData
private fun setRadioChecked(checked: Boolean) = _radioCheckedLiveData.value = checked
// handle radio check event
fun radioChecked(checked: Boolean) {
if (checked) {
// do something and change the data source
}
fun xxxFun() {
// if you want to change radioButton check status by code, no need to set RadioButton's status directly
setRadioChecked(true)
}
}
}
Activity {
val radioButton = RadioButton(context)
viewModel.radioCheckedLiveData.observe(this) {checked->
radioButton.checked = checked == true
}
radioButton.setOnCheckedListener {checked->
viewModel.radioChecked(checked)
}
}