我有一个有几个不同Activities
的应用。不同的活动有不同的样式按钮,文本等...我已根据其位置/活动设置所有组件以具有各种样式。 (例如style="@style/MainMenuActionBarTitle
或style="@style/MainMenuActionBarTagLine
)。这些样式设置了background
(Drawable
,MipMap
或Color
),textColor
等等。
该应用程序将提供一些主题包,可以在整个应用程序中更改这些不同组件的颜色,我希望有一种方法可以使Styles
具有相同的名称,但基于{的不同值该应用的{1}}这样,只要将Theme
加载到用户选择的任何主题,我就可以更改Theme
。
关于如何更改标准小部件外观&amp ;;有一些很好的信息here感觉使用主题,但这改变了标准 - 未样式小部件的外观和感觉。
有没有办法使用主题来实现这一目标,还是完全是错误的方向?有更好/更容易的路线吗?
编辑:经过更多的研究和更多的摆弄,我已经意识到我想要做的事与我如何做到这一点并不相符。我想要做的是在设置Activity
的{{1}}时实际更改组件Styles
。
答案 0 :(得分:0)
我发现的一个解决方案是使用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
中定义1}}。我想它不会通过选定的Theme
跟踪属性引用。
我最终使用的另一种方法是更多地使用属性。为我想要在主题之间更改的所有属性值创建属性。因此,我使用了main_menu_button_style_play
而不是定义样式引用的main_menu_button_play_background
。这种方法与简单指定样式的工作量相同,因为主题可以继承,但IDE理解它。