20

この質問はすでにどこかで答えられていると確信しています。あまりにも一般的なようです。しかし、私は答えを見つけることができません。解決策も思いつきません。

問題は次のとおりです。

TableRow の 1 つに別の背景色を持たせたい。簡単です、追加するだけです

android:background="#123456" 

TableRow の XML 宣言。ただし、アプリケーションに 2 つのテーマを持たせたいと考えています。他のテーマでは、TableRow の背景色が異なる必要があります。テーマ内で色の値を定義して使用する方法が見つかりません。次のように入力したいと思います。

<style name="Theme.MyApp" parent="@style/Theme.Light">
   <color "my_cool_color">#123456</color>
</style>

<style name="Theme.MyApp.Dark" parent="@style/Theme.Dark">
   <color "my_cool_color">#654321</color>
</style>

そして、TableRow の宣言では:

android:background="@color/my_cool_color"

そのため、テーマを変更すると、その 1 つの TableRow の背景の色も変更されます。私は何時間も多くの方法で試しましたが、成功しませんでした...私が試していないことの1つは、TableRowに基づいて独自のウィジェットを作成し、それに対して別のスタイルを宣言することでした-これはうまくいくはずですが、とても単純な問題には重すぎる解決策です。

4

1 に答える 1

54

これは、属性を使用して行うことができます。最初に属性を定義しますattrs.xml(このファイルは「values」フォルダーの下にあります)。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="myCoolColor" format="color" />
</resources>

次に、 で、各テーマstyles.xmlを定義します。myCoolColor

<style name="Theme.MyApp" parent="@style/Theme.Light">
   <item name="myCoolColor">#123456</item>
</style>

<style name="Theme.MyApp.Dark" parent="@style/Theme.Dark">
   <item name="myCoolColor">#654321</item>
</style>

ここでmyCoolColor、ビューの背景として指定します。

android:background="?myCoolColor"

さらに進んで、色への参照を使用して、色を 1 か所で定義しておくことができます。属性を変更して参照を含めます (色または参照を使用できることに注意してください)。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="myCoolColor" format="color|reference" />
</resources>

styles.xml各テーマの色を参照するように変更します。

<style name="Theme.MyApp" parent="@style/Theme.Light">
   <item name="myCoolColor">@color/blue</item>
</style>

<style name="Theme.MyApp.Dark" parent="@style/Theme.Dark">
   <item name="myCoolColor">@color/green</item>
</style>

最後に、で色を定義しますcolors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="blue">#0000FF</color>
    <color name="green">#00FF00</color>
</resources>

それでおしまい!

于 2011-12-25T23:02:17.053 に答える