使资源主题依赖

现在我们有两个图标(黑暗和光明)在ActionBar图标指南中所述 。

@drawable/ic_search_light @drawable/ic_search_dark 

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

<item android:title="Search" android:icon="哪里可以绘制? "/>

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

Solutions Collecting From Web of "使资源主题依赖"

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

假设我们有两个可绘制的 ,这种情况下的菜单图标:

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

我们希望使用ic_search_dark.png作为默认Theme应用程序主题,或者扩展它。同样,如果我们的应用程序主题更改为默认主题Theme.Light或某个主题扩展它,我们希望ic_search_light.png

/res/attrs.xml中定义一个具有唯一名称的通用属性, 如下所示:

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

这是一个全局属性,格式types是引用,在自定义视图的情况下,它可以与样式属性一起定义:

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

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

 <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"> 

相应的资源也会相应的使用。

主题也可以在代码中应用,通过在Activity的onCreate()开头设置它。

UPDATE

在这个答案中解释了从代码访问这些主题依赖资源的方法。