Задание ресурсов зависит от темы

Теперь, когда у нас есть две иконки (темные и светлые), как описано в ActionBar Icon Guide .

@drawable/ic_search_light @drawable/ic_search_dark 

Как ссылаться на эти значки в ресурсе меню XML:

<item android:title="Search" android:icon=" Какая здесь возможность? "/>

Каждый раз, когда вы переключаете тему приложения между Light и Dark, мне нужно обновить все эти доступные ссылки?

Существует способ определения ссылок на android (и многие другие элементы, найденные в res / values ), которые зависят от темы.

Предположим, что у нас есть две ярлыки , значки меню в этом случае:

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

И мы хотим использовать ic_search_dark.png для темы приложения, которая является темой по умолчанию или расширяет ее. Аналогично, мы хотим 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"> 

И соответствующие ресурсы будут использоваться соответственно.

Тема также может быть применена в коде, установив ее в самом начале onCreate() .

ОБНОВИТЬ

В этом ответе объясняется способ доступа к этим зависимым от темы ресурсам из кода.