CardView如何设置自定义drawable背景?设置后颜色不生效怎么解决
你写的box.xml自定义背景本身没有语法错误,不生效的核心原因是:CardView作为专门实现圆角、阴影、海拔效果的控件,内部会自行接管背景绘制逻辑,直接给它设置android:background属性,会被控件自身绘制的默认背景覆盖,所以自定义样式无法显示。
根据需求复杂度选择对应方案即可:
方案1:用CardView原生属性实现(最推荐,适配性最好)
如果你的需求只是纯色+圆角,完全不需要自定义drawable,直接用CardView自带的属性配置即可,不会和阴影、圆角裁切逻辑冲突:
<androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" app:cardBackgroundColor="#FF9800" app:cardCornerRadius="10dp" app:cardElevation="2dp"> <!-- 这里放CardView内的子控件即可 --> </androidx.cardview.widget.CardView>
如果不需要阴影效果,把app:cardElevation设为0dp就行。
注意:如果需要实现按压变色、多状态切换的selector效果,这个方案无法满足,选择方案2即可。
方案2:嵌套一层布局承载自定义背景(适合复杂样式)
如果后续要加按压状态、渐变、描边这类复杂selector效果,不要直接给CardView设置background,在CardView内部嵌套一层根布局承载自定义背景即可,同时把CardView自身的背景设为透明、去掉默认内边距、保证圆角值一致:
<androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" app:cardBackgroundColor="@android:color/transparent" app:cardCornerRadius="10dp" app:cardElevation="2dp" app:contentPadding="0dp"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/box"> <!-- 这里放页面内容控件 --> </FrameLayout> </androidx.cardview.widget.CardView>
注意:内部布局的圆角效果必须和app:cardCornerRadius值保持一致,否则边角会露出CardView的透明底色导致显示异常。
方案3:直接给CardView设置background(不推荐)
如果一定要直接给CardView挂自定义background,需要先把CardView自身的背景色设为透明:可以在xml里加app:cardBackgroundColor="@android:color/transparent",再设置android:background="@drawable/box"。但这个方案在不同Android版本、不同CardView依赖版本上容易出现阴影错位、圆角裁切不全的问题,非必要不要使用。
内容的提问来源于stack exchange,提问作者Kelven Lim

