我想让用户可以切换整个应用程序的颜色皮肤。我的意思是当用户按下屏幕按钮时动态切换应用程序的某些自定义视图的样式。我知道如果您在Activity.setTheme()
方法之前调用onCreate()
,您可以动态更改应用的主题,但是在其xml布局上应用了自定义样式的普通视图(例如,NavigationView
) ,没有setTheme或setStyle方法,因此似乎无法动态更改其样式。
我认为我的目标是可以引用在styles.xml
文件中声明的AppTheme中声明的颜色。我的意思是,我可以宣布两个AppThemes,每个都有一组颜色,然后,在为自定义视图声明的自定义样式中,引用颜色。像这样:
<resources>
<style name="AppTheme" parent="Theme.AppCompat">
<item name="customColor">#111111</item>
</style>
<style name="AppTheme.AnotherColor" parent="Theme.AppCompat">
<item name="customColor">#222222</item>
</style>
<style name="CustomActionBar">
<!-- title text color -->
<item name="android:textColorPrimary">@styles/customColor</item>
</style>
</resources>
因此,默认情况下,在我的&#34; AppTheme&#34;上声明了自定义颜色。默认情况下将使用颜色111111
应用。但是,当我使用setTheme(R.styles.AppTheme_AnotherColor)
更改应用的主题时,应用的颜色将为222222
。如果这是可能的,那将是完美的!但这是不可能的,或者我不知道如何直接从同一styles.xml
文件的另一种样式访问样式中声明的颜色。我的意思是@styles/customColor
不正确,我不知道如何访问该颜色。
如何实现这一目标?
答案 0 :(得分:6)
是的,绝对可以为主题添加自定义属性和颜色。为此你需要:
在res/values/attrs.xml
文件中定义自定义属性:
<resources>
<attr name="customColor" format="color" />
</resources>
在主题中定义属性的值:
<style name="AppTheme" parent="Theme.AppCompat">
<item name="customColor">#111111</item>
</style>
<style name="AppTheme.AnotherColor" parent="Theme.AppCompat">
<item name="customColor">#222222</item>
</style>
在您的样式中使用自定义属性:
<style name="CustomActionBar">
<!-- title text color -->
<item name="android:textColorPrimary">?attr/customColor</item>
</style>