Подтвердить что ты не робот

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

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

@drawable/ic_search_light 
@drawable/ic_search_dark

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

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

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

4b9b3361

Ответ 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

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