Android使用自定义主题来修改样式属性

时间:2015-04-08 20:18:04

标签: android android-theme android-styles

我想创建两个主题,GrayTheme和RedTheme,它们可以修改一个样式属性。例如,这是我的两个主题,默认字体颜色是白色,这适用于两个主题:

<style name="RedTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textColor">@color/white</item>
</style>

<style name="GrayTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textColor">@color/white</item>
</style>

但我有一种用于Header TextViews的样式。如果我使用的是RedTheme,我希望样式HeaderFont的textColor为红色,如果是GrayTheme,我希望HeaderFont textColor为灰色,而不必修改访问此HeaderFont样式的各个xml文件。

<style name="HeaderFont" parent="@android:style/TextAppearance.Medium">
    <item name="android:textColor">@color/gray</item>
</style>

我一直在寻找一个优雅的解决方案,但是找不到任何东西。想法?

1 个答案:

答案 0 :(得分:8)

在找到一个干净的解决方案失败后,我终于找到了一个效果很好的答案。

我创建了一个自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="headerFontColor" format="reference|color" />
</resources>

然后在风格中我添加了自定义属性

<style name="HeaderFont" parent="@android:style/TextAppearance.Medium">
    <item name="android:textColor">?headerFontColor</item>
</style>

然后我只是将新属性添加到主题

<style name="RedTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textColor">@color/white</item>
    <item name="headerFontColor">@color/red</item>
</style>
<style name="GrayTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textColor">@color/white</item>
    <item name="headerFontColor">@color/gray</item>
</style>

此解决方案引导我:Setting a color based on theme