1. ホーム
  2. android

[解決済み] drawable から style 属性を参照するには?

2022-11-17 08:19:53

質問

アプリケーションで2つのテーマを選択できるようにしたいです。そのために、以下のような属性を定義しました。

 <attr format="color" name="item_background" />

そして、このように両方のテーマを作成しました。

  <style name="ThemeA">
     <item name="item_background">#123456</item>
 </style>

 <style name="ThemeB">
     <item name="item_background">#ABCDEF</item>
 </style>

この方法はとてもうまくいき、いくつかのテーマを簡単に作成したり変更したりすることができます。問題は ビューでのみ使用可能で、ドローアブルでは使用できないようです。 .

例えば、レイアウト内のViewから値を参照することは動作します。

 <TextView android:background="?item_background" />

しかし、Drawableで同じことをすると、そうならない。

 <shape android:shape="rectangle">
     <solid android:color="?item_background" />
 </shape>

アプリケーションを実行すると、このエラーが発生します。

    java.lang.UnsupportedOperationException: Can't convert to color: type=0x2

もし ?item_background の代わりにハードコードされた色を使用すると、それは動作しますが、それは私のテーマを使用することはできません。また ?attr:item_background も試しましたが、同じことが起こります。

どうすればいいのでしょうか?また、なぜ Views では動作するのに、Drawables では動作しないのでしょうか。この制限をどこにも見つけることができません。 ドキュメント ...

どのように解決するのですか?

私の経験では、XML drawable で属性を参照することはできません。

テーマを作るために必要なのは

  • 1つのテーマにつき1つのXML drawableを作成します。
  • 必要な色を直接ドローアブルに取り込みます。 @color タグまたは #RGB フォーマットで、必要な色を直接描画可能にします。

で描画可能な属性を作成します。 attrs.xml .

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <!-- Attributes must be lowercase as we want to use them for drawables -->
   <attr name="my_drawable" format="reference" />
</resources>

描画可能なファイルを theme.xml に追加します。 .

<style name="MyTheme" parent="@android:style/Theme.NoTitleBar">
   <item name="my_drawable">@drawable/my_drawable</item>
</style>

属性を使って、レイアウトの中で描画可能なものを参照します。

<TextView android:background="?my_drawable" />