Установка цвета на основе темы

У меня есть акцент, который я использую в своих макетах. Я определил его как стиль, который я применяю к TextView.

Мое приложение позволяет пользователю выбирать между темной и светлой темами. Я хотел бы настроить цвет акцента на основе выбранной темы.

  • Вы не можете определить цвет в теме
  • Вы не можете определить цвет списка состояний на основе темы
  • Вы не можете разделить ресурсы на основе темы (как вы можете для версии или размера экрана)
  • Вы не можете обновить цвет ресурса из кода (не 100% по этому вопросу)

Как я должен контролировать свой цвет акцента на основе выбранной темы?

В руководстве разработчика приведен пример темы, использующей собственный цвет, близкий к тому, что я хочу. Мне нужно иметь возможность менять цвет во время выполнения. Я знаю, что я мог бы перейти к своему коду и местам X, где используется этот стиль, я мог бы выделить компонент и таким образом установить цвет. Но я бы подумал, что смогу достичь этого с помощью некоторой комбинации стиля / темы.

Спасибо

2 ответа

Я боролся с тем же вопросом и был близок к тому, чтобы сделать что-то похожее на то, что вы придумали, но, к счастью, я нашел следующее решение, которое я также изложил здесь.

Сначала вы определяете пользовательские цветовые поля в attr.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

<attr name="titleColor" format="reference|color" />
<attr name="introColor" format="reference|color" />

</resources>

Далее вы определяете свои темы

<style name="AppTheme.MyLight" parent="android:Theme">
   <item name="titleColor">#FFFFFF</item>
   <item name="introColor">#FFFFAA</item>
</style>


<style name="AppTheme.MyDark" parent="android:Theme">
   <item name="titleColor">#000000</item>
   <item name="introColor">#004444</item>
</style>

и, наконец, в вашем макете

<TextView
    android:id="@+id/quoteTitle"
    android:textColor="?titleColor"
    ...
</TextView>

<TextView
    android:id="@+id/quoteIntro"
    android:textColor="?introColor"
    ...
</TextView>

Кажется, в официальной документации Android по поводу использования атрибутов нет объяснений. Лучший ресурс, который я нашел здесь.

Я решил это путем создания подклассов android.widget.TextView. Я создал TextViewAccented и TextViewWarning. Я использую эти TextViews в моем XML, где я хочу акцентирование или предупреждение цвета. Я удаляю любые ссылки на цвета из XML.

Подклассы содержат три конструктора по умолчанию. Все три конструктора вызывают закрытый метод setColor(). Затем setColor () проверяет выбранную тему и может использовать нужный оттенок на основе текущей выбранной темы.

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

Другие вопросы по тегам