如何通过代码动态修改MaterialCardView的主题样式?
问题根源
setCardBackgroundColor() 方法仅接受颜色值或颜色资源ID作为参数,你传入的是样式资源ID R.style.serviceCall,系统会直接把样式对应的整型ID当成颜色值解析,自然会出现不符合预期的深紫色。
正确实现方案
方案一:主题颜色资源适配(推荐,实现成本最低)
这个方案不需要修改你原有主题结构,系统会自动匹配日间/夜间模式的对应样式:
- 定义适配模式的颜色资源
- 在
res/values/colors.xml(日间模式)中添加:
<color name="card_service_call">#替换为日间经停卡片背景色</color> <color name="card_service_pass">#替换为日间越行卡片背景色</color>- 在
res/values-night/colors.xml(夜间模式)中添加:
<color name="card_service_call">#替换为夜间经停卡片背景色</color> <color name="card_service_pass">#替换为夜间越行卡片背景色</color> - 在
- 代码中动态设置背景色:
// Java写法 int cardBgColor; if (trainStopsHere) { cardBgColor = ContextCompat.getColor(holder.itemView.getContext(), R.color.card_service_call); } else { cardBgColor = ContextCompat.getColor(holder.itemView.getContext(), R.color.card_service_pass); } holder.materialcardview.setCardBackgroundColor(cardBgColor);// Kotlin写法 val cardBgColor = if (trainStopsHere) { ContextCompat.getColor(holder.itemView.context, R.color.card_service_call) } else { ContextCompat.getColor(holder.itemView.context, R.color.card_service_pass) } holder.materialcardview.setCardBackgroundColor(cardBgColor)
如果要同时适配省电模式,可增加一层状态判断:
PowerManager powerManager = (PowerManager) holder.itemView.getContext().getSystemService(Context.POWER_SERVICE); boolean isPowerSaveMode = powerManager.isPowerSaveMode(); // 后续根据isPowerSaveMode的状态选择对应颜色即可
方案二:动态加载整套样式(适合除背景外还有圆角、阴影等多属性差异的场景)
如果你需要应用整组样式配置,可以直接给MaterialCardView设置样式(需要Material Components库版本≥1.2.0):
val styleRes = if (trainStopsHere) R.style.serviceCall else R.style.servicePass holder.materialcardview.style = styleRes
补充优化
如果你需要在XML布局中也复用这组样式,可以修改原有主题配置,和上面的颜色资源打通,保证全局样式统一:
<style name = "serviceCall" parent="Widget.MaterialComponents.CardView"> <item name="cardBackgroundColor">@color/card_service_call</item> <!-- 其他自定义配置,比如圆角、elevation等 --> </style> <style name = "servicePass" parent="Widget.MaterialComponents.CardView"> <item name="cardBackgroundColor">@color/card_service_pass</item> </style>
内容的提问来源于stack exchange,提问作者trainmania100
相关产品推荐
相关产品推荐

