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")))
专业开发者。我将尝试以编程方式更改卡片视图背景和描边颜色,但始终 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")))