web-dev-qa-db-ja.com

リソースをテーマに依存させる

ActionBarアイコンガイド で説明されているように、2つのアイコン(ダークとライト)ができました。

@drawable/ic_search_light 
@drawable/ic_search_dark

XMLメニューリソースでこれらのアイコンを参照する方法:

<item Android:title="Search" Android:icon="ここで描画できるのはどれですか? "/>

アプリケーションテーマをライトとダークの間で切り替えるたびに、これらすべての描画可能な参照を更新する必要がありますか?

29
S.D.

Android drawables(およびres/valuesにある他の多くの要素)をテーマに依存するように定義する方法があります。

この場合、2つのdrawables、メニューアイコンがあるとします。

_res/drawable/ic_search_light.png
res/drawable/ic_search_dark.png
_

また、デフォルトのThemeまたはそれを拡張したアプリケーションテーマに_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>
_

次に、2つのテーマを定義し、デフォルトの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_は、現在使用中のテーマの属性を指します。

これで、上記の2つのテーマをアプリケーションに使用できます。

_<application Android:theme="@style/CustomTheme">
_

または

_<application Android:theme="@style/CustomTheme.Light">
_

対応するリソースがそれに応じて使用されます。

テーマは、アクティビティのonCreate()の最初に設定することで、コードに適用することもできます。

[〜#〜]更新[〜#〜]

コードからこれらのテーマに依存するリソースにアクセスする方法は、 この回答 で説明されています。

74
S.D.