Изменение стилей 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 понимает это.

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