Ответ 1
Здесь можно определить, какие чертежи android (и многие другие элементы, найденные в 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>
Затем определите две темы, по умолчанию по умолчанию Theme
и Theme.Light
(или темы, которые наследуются от них) в res/styles.xml или res/themes.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">
и соответствующие ресурсы будут использоваться соответственно.
Тема также может применяться в коде, устанавливая ее в самом начале Activity onCreate()
.
UPDATE
Метод доступа к этим зависимым от темы ресурсам из кода объясняется в этом ответе.