在自定义样式中为一个主题覆盖Android背景,但不覆盖另一个

时间:2017-02-06 17:52:37

标签: android android-theme android-styles

我的Android应用程序AppThemeAppThemeDark使用了两个主题。我在主题定义中为每个设置了一个自定义按钮样式:

<!-- Theme definitions -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="android:buttonStyle">@style/ButtonStyle</item>
    ...
</style>

<style name="AppThemeDark" parent="Theme.AppCompat.DayNight.NoActionBar">
    ...
    <item name="android:buttonStyle">@style/ButtonStyleDark</item>
    ...
</style>

<!-- Button styles -->
<style name="ButtonStyle" parent="@style/Widget.AppCompat.Button">
    <item name="android:ellipsize">end</item>
    <item name="android:maxLines">2</item>
</style>

<style name="ButtonStyleDark" parent="ButtonStyle">
    <item name="android:background">@drawable/gray_button_bg</item>
</style>

请注意,我的AppTheme按钮ButtonStyle不会覆盖Widget.AppCompat.Button的背景,但AppThemeDark的按钮样式会继承ButtonStyle并更改背景。

现在,我想用特殊按钮的新自定义样式扩展buttonStyle,例如PrimaryButton。在AppTheme的情况下,我不想改变按钮的背景。在AppThemeDark案例中,我想要更改按钮的背景。

我想定义PrimaryButton并让它继承背景(在AppTheme的情况下)或使用新的背景(AppThemeDark)。像这样:

<style name="PrimaryButton">
    <item name="android:background">?attr/drawablePrimaryButtonBackground</item>
</style>

但据我所知,没有办法在AppThemeDark中将属性定义为新的drawable,AppTheme定义为“从父级继承”。设置为透明显然使AppTheme中的按钮背景透明。

我唯一的选择是在Widget.AppCompat.Button中弄清楚什么是drawable用于背景并在本地定义它?

1 个答案:

答案 0 :(得分:2)

回答我自己的问题......

  1. 您可以挖掘私有Android资源并使用本地副本来保留背景。这会将你锁定在一个特定的Android版本的drawable中(除非你复制多个版本)。
  2. 如果两个主题之间的样式不同,可以将整个样式设置为属性:
  3. <强> attrs.xml:

    <attr name="stylePrimaryButton" format="reference" />
    

    <强> styles.xml:

    <!-- Theme definitions -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        ...
        <item name="stylePrimaryButton">@style/PrimaryButton</item>
        ...
    </style>
    
    <style name="AppThemeDark" parent="Theme.AppCompat.DayNight.NoActionBar">
        ...
        <item name="stylePrimaryButton">@style/PrimaryButtonDark</item>
        ...
    </style>
    
    <!-- Primary button styles -->
    <style name="PrimaryButton">
        <!-- no need to override anything -->
    </style>
    
    <style name="PrimaryButtonDark">
        <item name="android:background">@drawable/dark_background</item>
    </style>
    

    <强> layout.xml:

        <Button style="?attr/stylePrimaryButton"
        ...