Цвет, зависящий от темы выбранных виджетов

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

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

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

Solutions Collecting From Web of "Цвет, зависящий от темы выбранных виджетов"

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

Это оно!