如何使用 AppCompat 应用主题通过 "android:theme" 属性设置 chipBackgroundColor

How to set chipBackgroundColor via "android:theme" attribute with an AppCompat app theme

我有一个 ChipGroup,其中有一个 Chip 项目:

<com.google.android.material.chip.ChipGroup
            android:id="@+id/chip_group"
            android:layout_width="0dp"
            android:theme="@style/DarkThemeTag"
            android:layout_height="wrap_content">

            <com.google.android.material.chip.Chip
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="@dimen/tag_text_dimen"
                app:chipIcon="@null"
                app:chipIconEnabled="false"/>

如您所见,我在 ChipGroup 上设置了 DarkThemeTag 主题。

<style name="DarkThemeTag" parent="Theme.MaterialComponents.Light.Bridge">
        <item name="chipBackgroundColor">@color/tag_chip_dark_checkable</item>
        <item name="android:textColor">@android:color/white</item>
    </style>

我的应用主题继承自 AppCompat,而不是 MaterialComponents:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
      ....
    </style> 

根据 Chip official page 它继承自 MaterialComponents 表示应用的主题应继承自 MaterialComponents。 在 this 文章中指出,如果您不能更改您的应用程序以继承自 MaterialComponents 而您想坚持使用 AppCompat,您应该使用 Bridge 主题之一,我就是这么做的。

问题是 chipBackgroundColor 属性不适用于 ChipGroup 的子项。然而 android:textColor 确实如此。

你们知道哪里出了问题吗?

注意:如果我在 Chip 元素上应用相同的样式,它会起作用

您应该在您的应用中使用 Bridge 主题:

<style name="AppTheme" parent="Theme.MaterialComponents.NoActionBar.Bridge">

您可以在小部件中使用 android:theme 来覆盖某些属性,例如不应用样式的颜色:

      <com.google.android.material.chip.ChipGroup
            android:theme="@style/DarkThemeTag"
            ..>

与:

<style name="DarkThemeTag" parent="">
    <item name="android:textColor">@android:color/white</item>
</style>

然后您可以在小部件中应用自定义样式

        <com.google.android.material.chip.Chip
            style="@style/my_chip"
            ../>

与:

<style name="my_chip" parent="@style/Widget.MaterialComponents.Chip.Action">
   <item name="chipBackgroundColor">@color/tag_chip_dark_checkable</item>
</style>

或者您可以简单地将它应用到您的布局中:

        <com.google.android.material.chip.Chip
            app:chipBackgroundColor="....."
            ../>

如果你想覆盖使用android:theme的芯片背景颜色,你应该使用:

        <com.google.android.material.chip.Chip
            android:theme="@style/custom_color"
            ../>

与:

<style name="custom_color" parent="">
    <item name="colorPrimary">....</item>
    <item name="colorOnSurface">....</item>
</style>

因为 chipBackgroundColor 中的默认选择器使用这些颜色。