将可观察字段绑定到动态创建的视图

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)
  }
}