28

これで、 ActionBarアイコンガイドで説明されているように、2つのアイコン(暗い色と明るい色)ができました。

@drawable/ic_search_light 
@drawable/ic_search_dark

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

<item android:title="Search" android:icon="ここでドローアブルはどれですか? "/>

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

4

1 に答える 1

75

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

この場合、2つのドローアブル、メニューアイコンがあると仮定します。

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>

次に、res/styles.xmlまたはres/themes.xmlThemeでデフォルトとTheme.Light(またはこれらから継承するテーマ)を拡張する2つのテーマを定義します。

<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()

アップデート

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

于 2012-09-09T14:26:30.880 に答える