【问题标题】:Making resources theme dependent使资源主题依赖
【发布时间】:2012-09-09 10:17:19
【问题描述】:

现在我们有了ActionBar Icon Guide 中描述的两个图标(深色和浅色)。

@drawable/ic_search_light 
@drawable/ic_search_dark

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

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

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

【问题讨论】:

  • 为 Holo Light 创建一个主题,为 Holo dark 创建一个主题。每次用户选择其他主题时,您都可以在它们之间切换。
  • 这并没有解释我如何引用菜单图标,这不是一个可样式化的小部件。
  • 实际上确实如此 - 我的意思是:创建 2 个主题/菜单。在第一个中,您可以引用所有全息灯图标,在第二个中,您可以引用所有全息暗图标。因此,如果您的用户决定切换,您只需更改主题(而不是所有图标)。
  • 更新了我在答案中的发现。

标签: android android-theme


【解决方案1】:

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

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

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>

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

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

接下来,定义两个主题,在 res/styles.xmlres/themes.xml em>:

<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() 的最开头。

更新

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

【讨论】:

  • 所有主题相关资源也是如此(几乎)。很好的总结。
  • 这个逻辑几个月来对我来说看起来很奇怪,我从来没有见过一个答案能像你给出的一样简短概述。很好解释!太感谢了。我想 xml 中的东西现在对我来说会变得更清楚。 :)
  • 也适用于颜色!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2020-11-11
  • 2018-07-23
  • 2014-08-18
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多