如何使用 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
中的默认选择器使用这些颜色。
我有一个 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
中的默认选择器使用这些颜色。