使资源主题依赖

时间:2012-09-09 10:17:20

标签: android android-theme

现在我们有ActionBar Icon Guide中描述的两个图标(黑暗和光明)。

@drawable/ic_search_light 
@drawable/ic_search_dark

如何在XML菜单资源中引用这些图标:

<item android:title="Search" android:icon="哪个可以在这里画画? "/>

每次在Light和Dark之间切换应用程序主题时,我是否必须更新所有这些可绘制的引用?

1 个答案:

答案 0 :(得分:74)

有一种方法可以将android drawables (以及 res / values 中的许多其他元素)定义为依赖于主题。

假设我们有两个 drawables ,在这种情况下菜单图标:

res/drawable/ic_search_light.png
res/drawable/ic_search_dark.png

我们希望将ic_search_dark.png用于默认Theme的应用主题或扩展它,同样,如果我们的应用主题更改为默认ic_search_light.png,我们需要Theme.Light或一些主题扩展它。

/res/attrs.xml 中定义具有唯一名称的常规属性,如:

<resources>
<attr name="theme_dependent_icon" format="reference"/>
</resources>

这是一个全局属性和格式类型是引用,如果是自定义视图,它可以与样式属性一起定义:

<resources>
    <declare-styleable name="custom_menu">
        <attr name="theme_dependent_icon" format="reference"/>
    </declare-styleable>
</resources>

接下来,定义两个主题,在 res / styles.xml res / themes中扩展默认ThemeTheme.Light(或从这些主题继承的主题) .XML

<resources>
    <style name="CustomTheme" parent="android:Theme">
        <item name="theme_dependent_icon" >@drawable/ic_search_dark</item>
    </style>

    <style name="CustomTheme.Light" parent="android:Theme.Light">
        <item name="theme_dependent_icon" >@drawable/ic_search_light</item>
    </style>
</resources>

最后,使用我们定义的引用属性来引用这些图标。在这种情况下,我们在定义菜单布局时使用

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="Menu Item"  android:icon="?attr/theme_dependent_icon"/>
</menu>

?attr指的是当前主题的属性。

现在,我们可以使用以上两个主题进行申请:

<application android:theme="@style/CustomTheme">

<application android:theme="@style/CustomTheme.Light">

将相应地使用相应的资源。

主题也可以在代码中应用,方法是在活动onCreate()的最开头设置。

<强>更新

this answer中解释了从代码访问这些依赖于主题的资源的方法。