Изменение стилей Android с помощью темы
У меня есть приложение с несколькими разными Activities
, Разные действия имеют разные стилизованные кнопки, тексты и т. Д. Я настроил все компоненты на разные стили в зависимости от их расположения / активности. (Например. style="@style/MainMenuActionBarTitle
, или же style="@style/MainMenuActionBarTagLine
). Эти стили устанавливают background
(Drawable
, MipMap
, или же Color
), textColor
, так далее...
Приложение будет предлагать несколько пакетов тем, которые меняют цвета этих различных компонентов по всему приложению, и я надеялся, что есть способ Styles
с тем же именем, но разными значениями, основанными на Theme
приложения. Таким образом, я могу просто изменить Theme
всякий раз, когда Activity
загружается в любую тему, выбранную пользователем.
Здесь есть некоторая полезная информация о том, как изменить внешний вид стандартного виджета с помощью Тем, но это меняет внешний вид стандартных виджетов без стилей.
Есть ли способ сделать это, используя Темы, или это неправильное направление? Есть ли лучший / более легкий маршрут?
Изменить: После проведения дополнительных исследований и больше возни, я понял, что то, что я хочу сделать, не далеко от того, как я могу сделать это. Что я хочу сделать, это на самом деле изменить компонент Styles
когда я установил Theme
из Activity
,
1 ответ
Одно решение, которое я обнаружил, заключается в использовании attributes
который Theme
может указывать на разные Styles
,
attrs.xml
<resources>
<!-- Attributes referencing whatever style the theme needs to set up. -->
<attr name="main_menu_button_style_play" format="reference" />
</resources>
themes.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- App specific attributes -->
<item name="@attr/main_menu_button_style_play">@style/MainMenu.Button.Play</item>
</style>
<!-- Blue application theme. -->
<style name="AppTheme.Blue" parent="AppTheme">
<!-- App specific attributes -->
<item name="@attr/main_menu_button_style_play">@style/MainMenu.Button.Play.Blue</item>
</style>
</resources>
styles.xml
<style name="MainMenu.Button.Play">
<item name="android:background">#f76d3c</item>
<item name="android:text">PLAY</item>
</style>
<style name="MainMenu.Button.Play.Blue">
<item name="android:background">#2ca8c2</item>
</style>
activity.xml
<Button android:id="@+id/main_play_button"
style="?attr/main_menu_button_style_play"/>
Это работает очень хорошо, и позволяет мне установить Theme
в Activity.onCreate()
метод.
Единственная досадная проблема, с которой я сталкиваюсь, заключается в том, что Android Studio жалуется, что Button
отсутствует layout_width
а также layout_height
хотя они определены в Style
, Я предполагаю, что это не следует за ссылкой атрибута через выбранный Theme
,
Другой подход, который я использовал в конечном итоге, заключался в более интенсивном использовании атрибутов. Создание атрибутов для всех значений свойств, которые я хочу менять между темами. Итак, вместо main_menu_button_style_play
который определяет ссылку на стиль, я использовал main_menu_button_play_background
, Этот подход представляет собой тот же объем работы, что и простое указание стиля, поскольку темы могут наследоваться, но среда IDE понимает это.