Настройка цвета на основе темы
У меня есть цвет акцента, который я использую в своих макетах. Я определил его как стиль, который я применяю к TextView.
Мое приложение позволяет пользователю выбирать между темной темой и легкой темой. Я хотел бы настроить цвет акцента на основе выбранной темы.
- Вы не можете определить цвет в теме
- Вы не можете определить цвет списка состояний на основе темы
- Вы не можете разделять ресурсы на основе темы (как вы можете для версии или размера экрана)
- Вы не можете обновить цвет ресурса из кода (не 100% на этом???)
Как я должен контролировать свой цвет акцента на основе выбранной темы?
В руководстве dev приведен пример темы с использованием пользовательского цвета, который близок к тому, что я хочу. Мне нужно изменить цвет во время выполнения. Я знаю, что могу войти в свой код и в X местах, где используется этот стиль. Я мог бы выделить компонент и установить цвет таким образом. Но я бы подумал, что смогу выполнить это с некоторой комбинацией стиля/темы.
Спасибо
Ответы
Ответ 1
Я боролся с тем же вопросом и был близок к тому, чтобы сделать что-то похожее на то, что вы придумали, но, к счастью, я нашел следующее решение, которое я также заявил здесь.
Сначала вы определяете пользовательские поля цвета в 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>
В официальной андроидной документации об использовании атрибутов, похоже, нет никаких объяснений. Лучший ресурс, который я нашел, здесь.
Ответ 2
Как я решил, это было создание подклассов android.widget.TextView. Я создал TextViewAccented и TextViewWarning. Я использую эти TextViews в своем XML, где мне нужен цвет акцента или предупреждения. Я удаляю любые ссылки на цвета из XML.
Подклассы содержат три стандартных конструктора. Все три конструктора называют частный метод, называемый setColor(). setColor() затем проверяет выбранную тему и может использовать желаемый оттенок на основе выбранной темы.
Это довольно чистый механизм, но мне трудно поверить, что я не могу закодировать это в теме. Это похоже на то, для чего должна быть тема.