Android:如何为可点击的CardView设置点击状态变色效果?
当然可以实现点击变色效果!问题出在CardView的background属性作用逻辑和Button不一样——CardView的background是用来定义它的卡片底色、圆角和阴影的,直接把你的selector设在这里会被CardView自身的绘制逻辑覆盖,所以看不到效果。另外你已经设置了foreground="?android:attr/selectableItemBackground",这个系统自带的波纹效果也会和你的自定义selector产生冲突。
下面给你两种可行的解决方案:
方案一:将Selector设置为CardView的Foreground
移除android:background="@drawable/selector",把selector放到foreground属性上,同时去掉原来的系统foreground值:
<android.support.v7.widget.CardView android:clickable="true" android:layout_width="170dp" android:layout_height="150dp" android:layout_margin="4dp" android:onClick="economy" android:foreground="@drawable/selector" > </android.support.v7.widget.CardView>
注意:如果你的selector里是纯色,点击时可能会覆盖CardView的阴影和圆角,建议给selector里的每个item添加shape来匹配CardView的圆角(和CardView的cardCornerRadius参数保持一致),修改后的selector示例:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="@color/button_pressed" /> <corners android:radius="@dimen/card_corner_radius" /> </shape> </item> <item android:state_focused="true"> <shape android:shape="rectangle"> <solid android:color="@color/button_focused" /> <corners android:radius="@dimen/card_corner_radius" /> </shape> </item> <item> <shape android:shape="rectangle"> <solid android:color="@color/button_default" /> <corners android:radius="@dimen/card_corner_radius" /> </shape> </item> </selector>
方案二:在CardView内部嵌套布局,给内部布局设置Selector
这种方法更灵活,完全不会影响CardView本身的阴影和圆角:
- 在CardView里添加一个填充整个卡片的LinearLayout(或其他布局)
- 把你的selector设为这个内部布局的
background - 确保CardView和内部布局都设置
clickable="true"(也可以只给CardView设置,内部布局设clickable="false",只要点击事件能正常传递即可)
示例代码:
<android.support.v7.widget.CardView android:clickable="true" android:layout_width="170dp" android:layout_height="150dp" android:layout_margin="4dp" android:onClick="economy" app:cardCornerRadius="@dimen/card_corner_radius" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:background="@drawable/selector" android:orientation="vertical"> <!-- 这里放置CardView的内容,比如TextView、ImageView等 --> </LinearLayout> </android.support.v7.widget.CardView>
这种方式下,CardView的阴影和圆角不受影响,点击时内部布局的背景会按照selector变色,视觉上就呈现出整个CardView的点击变色效果。
内容的提问来源于stack exchange,提问作者Nilay Singh
相关产品推荐
相关产品推荐

