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