MaterialCardView 以编程方式更改背景颜色和描边颜色

MaterialCardView change background color and stroke color programmatically

专业开发者。我将尝试以编程方式更改卡片视图背景和描边颜色,但始终 card.setCardBackgroundColor() 覆盖描边颜色。静态地在 XML 中,效果很好。但是以编程方式它会产生这样的效果。

val colorWithAlpha = ColorUtils.setAlphaComponent(tagColor, 128)
tagView.card.setStrokeColor(ColorStateList.valueOf(colorWithAlpha))
tagView.card.setCardBackgroundColor(ColorStateList.valueOf(tagColor))

同样适用于:card.backgroundTintList = ColorStateList.valueOf(tagColor)

XML:

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/card"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="#DB8A61"
    app:cardCornerRadius="8dp"
    app:cardElevation="0dp"
    app:cardUseCompatPadding="true"
    app:cardPreventCornerOverlap="true"
    app:strokeColor="#EBD3C7"
    app:strokeWidth="4dp">

    <com.google.android.material.textview.MaterialTextView
        android:id="@+id/tag_text"
        style="@style/SmallLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:lines="1"
        android:paddingStart="8dp"
        android:paddingTop="4dp"
        android:paddingEnd="8dp"
        android:paddingBottom="4dp"
        android:textColor="@color/white"
        app:autoSizeMaxTextSize="100sp"
        app:autoSizeMinTextSize="5sp"
        app:autoSizeStepGranularity="1sp"
        app:autoSizeTextType="uniform"
        tools:text="Some Text" />

</com.google.android.material.card.MaterialCardView>

外观: 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.setStrokeColor(ColorStateList.valueOf(colorWithAlpha))
        tagView.card.setCardBackgroundColor(ColorStateList.valueOf(tagColor))
    }

删除时:tagView.card.setCardBackgroundColor(ColorStateList.valueOf(tagColor))

当没有程序更改时(颜色由 XML 设置)看起来像预期的那样:

如何让它像XML节目中那样?

我认为问题不在 MaterialCardView background/stroke 方法中;但是在布局中使用的颜色阴影与以编程方式使用的颜色阴影不同。

布局中使用的颜色:

app:cardBackgroundColor="#DB8A61"
app:strokeColor="#EBD3C7"

但是以编程方式,您使用 tagColor 并使用 colorWithAlpha 添加 alpha 通道;您没有提供 tagColor;但是添加 128 个 alpha 组件不会改变那么多;这与根本没有 alpha 分量的布局颜色完全不同。

因此,要以编程方式获得相同的颜色,只需在没有 alpha 组件的情况下重复使用相同的布局颜色即可:

tagView.card.setCardBackgroundColor(ColorStateList.valueOf(Color.parseColor("#DB8A61")))
tagView.card.setStrokeColor(ColorStateList.valueOf(Color.parseColor("#EBD3C7")))