Я хотел бы создать ChipGroup 2-way Binding Adapter. Я скопировал адаптер привязки RadioGroup по умолчанию с некоторыми изменениями, но он не работает в обоих направлениях. В случае установки данных для наблюдаемых программно, ChipGroup извлекает из них изменения. Но выбор чипа вручную не устанавливает изменения на наблюдаемые.
Вот мой адаптер
@InverseBindingMethods(InverseBindingMethod(type = ChipGroup::class, attribute = "android:checkedButton", method = "getCheckedRadioButtonId"))
class ChipGroupBindingAdapter {
companion object {
@JvmStatic
@BindingAdapter("android:checkedButton")
fun setCheckedChip(view: ChipGroup?, id: Int) {
if (id != view?.checkedChipId) {
view?.check(id)
}
}
@JvmStatic
@BindingAdapter(value = ["android:onCheckedChanged", "android:checkedButtonAttrChanged"], requireAll = false)
fun setChipsListeners(view: ChipGroup?, listener: ChipGroup.OnCheckedChangeListener?,
attrChange: InverseBindingListener?) {
if (attrChange == null) {
view?.setOnCheckedChangeListener(listener)
} else {
view?.setOnCheckedChangeListener { group, checkedId ->
listener?.onCheckedChanged(group, checkedId)
attrChange.onChange()
}
}
}
}
}
Файл макета:
<android.support.design.chip.ChipGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checkedButton="@{viewModel.checkedBtnObs}"
app:singleSelection="true">
<android.support.design.chip.Chip
android:id="@+id/first_chip"
style="@style/Widget.MaterialComponents.Chip.Choice"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:checkable="true"
android:text="@string/month_12"
app:chipBackgroundColor="@drawable/chip_background_selector" />
<android.support.design.chip.Chip
android:id="@+id/second_chip"
style="@style/Widget.MaterialComponents.Chip.Choice"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:checkable="true"
android:text="@string/month_6"
android:textAlignment="center"
app:chipBackgroundColor="@drawable/chip_background_selector" />
<android.support.design.chip.Chip
android:id="@+id/third_chip"
style="@style/Widget.MaterialComponents.Chip.Choice"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:checkable="true"
android:text="@string/month_1"
app:chipBackgroundColor="@drawable/chip_background_selector" />
</android.support.design.chip.ChipGroup>
И наблюдаемый:
val checkedBtnObs = ObservableInt(R.id.second_chip)