我发现的一种解决方案是使用attributes
canTheme
指向不同的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"/>
这非常有效,并允许我Theme
在Activity.onCreate()
方法中设置。
我对这个解决方案唯一恼人的问题是 Android Studio 抱怨Button
缺少layout_width
andlayout_height
即使它们是在Style
. 我猜它不会通过 selected 跟随属性引用Theme
。
我最终使用的另一种方法是更多地使用属性。为我想在主题之间更改的所有属性值创建属性。因此,main_menu_button_style_play
我使用main_menu_button_play_background
. 这种方法与简单地指定样式的工作量相同,因为主题可以继承,但 IDE 可以理解。