现在我们有两个图标(深色和浅色),如ActionBar Icon Guide中所述。
@drawable/ic_search_light
@drawable/ic_search_dark
如何在 XML 菜单资源中引用这些图标:
<item android:title="Search" android:icon="
哪个drawable在这里?
"/>
每次在 Light 和 Dark 之间切换应用程序主题时,我是否必须更新所有这些可绘制引用?
现在我们有两个图标(深色和浅色),如ActionBar Icon Guide中所述。
@drawable/ic_search_light
@drawable/ic_search_dark
如何在 XML 菜单资源中引用这些图标:
<item android:title="Search" android:icon="
哪个drawable在这里?
"/>
每次在 Light 和 Dark 之间切换应用程序主题时,我是否必须更新所有这些可绘制引用?
有一种方法可以将 android drawables (以及res/values中的许多其他元素)定义为依赖于主题。
假设我们有两个可绘制对象,在这种情况下是菜单图标:
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.xml中定义两个主题,扩展默认Theme
和Theme.Light
(或从这些主题继承的主题):
<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()
。
更新
此答案中解释了从代码访问这些主题相关资源的方法。