Подтвердить что ты не робот

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

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

Здесь проблема:

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

4b9b3361

Ответ 1

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

Что это!