2011-12-25 4 views
18

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

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

Я хочу, чтобы один из моих 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 и декларировал отдельный стиль для него - я думаю, что это должно сработать, но это просто слишком тяжелое решение для столь простой проблемы.

ответ

51

Вы можете сделать это, используя атрибуты. Сначала определите свой атрибут в attrs.xml (этот файл идет в папке «ценности»):

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

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

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

Это все!

+0

Спасибо! Я нашел что-то о attr.xml, но не нашел подходящего примера. Напротив, ваш ответ не может быть более полным! – user1234567

+0

Я нашел ваш ответ очень полезным и решил свою проблему. +1. Но у меня все еще есть одна проблема, я хочу использовать определенные цвета в коде. Как я могу это сделать, как использовать цвета из attrs в коде (а не xml)? – Sandra

+0

Да, но если я использую темную тему, я хочу, чтобы цвет был синим, а для другого - зеленым. Но как я могу получить правильный цвет в коде? – Sandra

Смежные вопросы