テーマに依存するように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()
。
アップデート
コードからこれらのテーマに依存するリソースにアクセスする方法は、この回答で説明されています。