Android开发:如何实现Checkbox点击时按下背景变色松开恢复效果?
问题解答
方案1:继续使用原生CheckBox实现需求
你之前没实现按压效果是因为selector只配置了state_checked状态,没有添加state_pressed的状态规则,且你把星星图标直接设为background,导致没法同时实现背景色切换+图标展示的效果,修改步骤如下:
- 第一步:新建合并了背景和图标的selector,命名为
checkbox_background.xml:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 按压状态:浅蓝背景+对应状态的星星图标 --> <item android:state_pressed="true"> <layer-list> <item> <shape> <solid android:color="@color/blue_200"/> <corners android:radius="@dimen/_8sdp"/> </shape> </item> <item android:drawable="@drawable/inflated_selector_is_checked" android:gravity="center"/> </layer-list> </item> <!-- 常态:深蓝背景+对应状态的星星图标 --> <item> <layer-list> <item> <shape> <solid android:color="@color/blue_500"/> <corners android:radius="@dimen/_8sdp"/> </shape> </item> <item android:drawable="@drawable/inflated_selector_is_checked" android:gravity="center"/> </layer-list> </item> </selector> - 第二步:修改CheckBox布局配置
<CheckBox android:id="@+id/btn_addtofavs" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/checkbox_background" android:button="@null" android:checked="@={inflatedItemViewModel.item.checked}" android:onClick="@{() -> inflatedItemViewModel.updateChecked(inflatedItemViewModel.item.id, inflatedItemViewModel.item.checked)}" tools:ignore="ContentDescription" />
方案2:修复MaterialButton双向绑定报错问题
你遇到的找不到checked属性getter的报错,是因为普通MaterialButton默认没有适配双向绑定的checked属性,两种修复方式可选:
- 方式A:直接替换为
com.google.android.material.checkbox.MaterialCheckBox,这是Material设计规范的CheckBox组件,原生支持双向绑定checked属性,用法和原生CheckBox完全一致。 - 方式B:自定义双向绑定适配器,给MaterialButton添加checked属性的双向绑定支持:
添加上述适配器后,你现有的MaterialButton布局代码即可正常运行。// 自定义BindingAdapter代码 @BindingAdapter("android:checked") fun setChecked(button: MaterialButton, isChecked: Boolean) { if (button.isChecked != isChecked) { button.isChecked = isChecked } } @InverseBindingAdapter(attribute = "android:checked", event = "android:checkedAttrChanged") fun getChecked(button: MaterialButton): Boolean { return button.isChecked } @BindingAdapter("android:checkedAttrChanged") fun setCheckedListener(button: MaterialButton, listener: InverseBindingListener?) { button.setOnCheckedChangeListener { _, _ -> listener?.onChange() } }
内容的提问来源于stack exchange,提问作者pepper90
相关产品推荐
相关产品推荐

