Тематически зависимые цвета выбранных виджетов - PullRequest
18 голосов
/ 25 декабря 2011

Я почти уверен, что на этот вопрос уже был дан ответ.Это кажется слишком распространенным.Но я не могу найти ответ.Я не могу также найти решение.

Вот проблема:

Я хочу, чтобы у одного из моих TableRow был другой цвет фона.Все просто, мне просто нужно добавить

android:background="#123456" 

в XML-декларации TableRow.Но я также хочу, чтобы в моем приложении было две темы.В другой теме у 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"

Итак, когда я изменяю тему, цвет фона этого TableRow также меняется,Я пытался разными способами в течение многих часов, но у меня ничего не получалось ... Одна вещь, которую я не пробовал, это создать свой собственный виджет на основе TableRow и объявить для него отдельный стиль - я думаю, что это должно работать, но этослишком тяжелое решение для такой простой проблемы.

1 Ответ

51 голосов
/ 26 декабря 2011

Вы можете сделать это, используя атрибуты. Сначала определите свой атрибут в 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"

Вы можете пойти дальше и использовать ссылку на цвет, чтобы вы могли сохранить свои цвета, определенные в одном месте. Измените атрибут для включения ссылки (обратите внимание, что мы можем использовать цвет ИЛИ ссылку):

<?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>

Вот и все!

...