如何代码动态修改MaterialCardView的背景色与描边色不互相覆盖
解决方案
问题原因
该问题由MaterialCardView的属性设置顺序和部分版本Material Components库的内部逻辑导致:调用setCardBackgroundColor()时会重置已设置的描边相关配置,代码中先设置描边色再设置背景色,就会导致描边色被覆盖。XML配置时系统会按属性定义顺序处理,描边属性在背景色之后加载,所以不会出现该问题。
修复步骤
- 调整属性设置顺序,先设置背景色,再设置描边相关参数
- 动态设置时显式指定描边宽度,避免配置被重置后丢失XML中定义的数值
修复后代码示例
private fun createAddTagView(tagName: String, tagColor: Int, container: ViewGroup) { val tagView = LayoutTagBinding.inflate(inflater, container, true) tagView.tagText.text = tagName val colorWithAlpha = ColorUtils.setAlphaComponent(tagColor, 128) // 先设置背景色 tagView.card.setCardBackgroundColor(ColorStateList.valueOf(tagColor)) // 再设置描边宽度和描边色 // 4dp转px,也可以提前在dimen.xml中定义后通过resources.getDimensionPixelSize读取 val strokeWidth = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 4f, resources.displayMetrics ).toInt() tagView.card.strokeWidth = strokeWidth tagView.card.setStrokeColor(ColorStateList.valueOf(colorWithAlpha)) }
如果调整顺序后仍不生效,可以升级你的Material Components依赖版本到1.5.0及以上,该版本已修复了背景设置覆盖描边的已知bug。
内容的提问来源于stack exchange,提问作者billy gates
相关产品推荐
相关产品推荐

