2

我有几个不同的应用程序Activities。不同的活动有不同样式的按钮、文本等...我已经将所有组件设置为根据它们的位置/活动具有不同的样式。(例如style="@style/MainMenuActionBarTitle,或style="@style/MainMenuActionBarTagLine)。这些样式设置background( Drawable, MipMap, or Color), textColor, 等等...

该应用程序将提供一些主题包,它们可以在整个应用程序中更改这些不同组件的颜色,我希望有一种方法可以Styles使用相同的名称,但基于Theme应用程序的不同值。这样我就可以在加载到用户选择的任何主题Theme时更改。Activity

这里有一些关于如何使用主题更改标准小部件外观和感觉的好信息,但这会改变标准非样式小部件的外观。

有没有办法使用主题来实现这一点,或者这完全是错误的方向?有更好/更简单的路线吗?

编辑:在做了更多的研究和更多的摆弄之后,我意识到我想要做的离我如何做到这一点并不遥远。我想要做的是在Styles设置.ThemeActivity

4

1 回答 1

1

我发现的一种解决方案是使用attributescanTheme指向不同的Styles.

attrs.xml

<resources>
   <!-- Attributes referencing whatever style the theme needs to set up. -->
   <attr name="main_menu_button_style_play" format="reference" />
</resources>

主题.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>

样式.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>

活动.xml

<Button android:id="@+id/main_play_button"
        style="?attr/main_menu_button_style_play"/>

这非常有效,并允许我ThemeActivity.onCreate()方法中设置。

我对这个解决方案唯一恼人的问题是 Android Studio 抱怨Button缺少layout_widthandlayout_height即使它们是在Style. 我猜它不会通过 selected 跟随属性引用Theme

我最终使用的另一种方法是更多地使用属性。为我想在主题之间更改的所有属性值创建属性。因此,main_menu_button_style_play我使用main_menu_button_play_background. 这种方法与简单地指定样式的工作量相同,因为主题可以继承,但 IDE 可以理解。

于 2015-06-30T20:48:54.950 回答