使用主题更改Android样式

时间:2015-06-29 15:25:14

标签: android android-theme android-styles android-attributes

我有一个有几个不同Activities的应用。不同的活动有不同的样式按钮,文本等...我已根据其位置/活动设置所有组件以具有各种样式。 (例如style="@style/MainMenuActionBarTitlestyle="@style/MainMenuActionBarTagLine)。这些样式设置了backgroundDrawableMipMapColor),textColor等等。

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

关于如何更改标准小部件外观&amp ;;有一些很好的信息here感觉使用主题,但这改变了标准 - 未样式小部件的外观和感觉。

有没有办法使用主题来实现这一目标,还是完全是错误的方向?有更好/更容易的路线吗?

编辑:经过更多的研究和更多的摆弄,我已经意识到我想要做的事与我如何做到这一点并不相符。我想要做的是在设置Activity的{​​{1}}时实际更改组件Styles

1 个答案:

答案 0 :(得分:0)

我发现的一个解决方案是使用attributesTheme可以指向不同的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_widthlayout_height,即使它们已在{{Style中定义1}}。我想它不会通过选定的Theme跟踪属性引用。

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