android - ChipGroup 2 路绑定(bind)适配器

标签 android kotlin android-databinding android-chips

我想创建 ChipGroup 2 路绑定(bind)适配器。我已经复制了默认的 RadioGroup 绑定(bind)适配器并进行了一些更改,但它不适用于两种方式。在以编程方式将数据设置为可观察的情况下,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)

最佳答案

最后,我找到了解决方案。
InverseBindingMethod 方法应该是 getCheckedChipId而不是 getCheckedRadioButtonId
另外,@=应添加到 xml android:checkedButton="@{viewModel.checkedBtnObs}"像这样 android:checkedButton="@={viewModel.checkedBtnObs}"
现在这个适配器可以用于 ChipGroup 2-way binding

@InverseBindingMethods(InverseBindingMethod(type = ChipGroup::class, attribute = "android:checkedButton", method = "getCheckedChipId"))
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 - ChipGroup 2 路绑定(bind)适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52329319/

相关文章:

android - 当jetpack compose中的第一个文本很长时,将省略号添加到第一个文本中

java - Android Studio 数据绑定(bind)错误,无法解析符号

Android View 绑定(bind) - 多模块项目中 Unresolved 引用

android - 矢量图像在 Android 中显示错误

android - 如何使 "ndk-build clean"继续出错

kotlin - 如何在 kotlin DSL 构建器中创建所需的字段

android - 点击事件在MVVM架构中的位置

android - 如何在android中添加新联系人

java - 如何在Android应用程序中添加好友?

kotlin - 如何在 Kotlin 中使用堆栈?