用户可选的主题(亮和暗),用具有其自己的资源的每个主题,是直接实现如果单个父主题是在该应用中使用:
<style name="MyApp.Dark" parent="android:Theme.Material">
<item name="themeBackground">@color/dark_grey</item>
<item name="themeBackgroundTransparent">@color/darkColorBackgroundTransparent</item>
<item name="colorPrimary">@color/darkColorPrimary</item>
.
.
</style>
<style name="MyApp.Light" parent="android:Theme.Material.Light">
<item name="themeBackground">@color/brown_50</item>
<item name="themeBackgroundTransparent">@color/lightColorBackgroundTransparent</item>
<item name="colorPrimary">@color/lightColorPrimary</item>
.
.
</style>
Run Code Online (Sandbox Code Playgroud)
但是,典型的Android应用可能会在整个应用中采用多个父主题,例如对话框主题,无操作栏主题或大对话框对话框。当前扩展的主题不会覆盖这些主题Theme.Material(因为继承是昂贵的),因此使用这些主题将需要为浅色和深色主题添加其他样式定义:
<style name="MyApp.DialogWhenLarge.Light" parent="android:Theme.Material.Light.DialogWhenLarge">
</style>
<style name="MyApp.DialogWhenLarge.Dark" parent="android:Theme.Material.DialogWhenLarge">
</style>
Run Code Online (Sandbox Code Playgroud)
为了将主题资源应用于新主题,简单的解决方案是将MyApp.Dark主题中的单个项目复制并粘贴到新MyApp.DialogWhenLarge.Dark主题中,等等,但是随着代码数量的增加,重复代码的数量变得难以管理,难以理解且容易出错主题和资源。
所以我的问题是,将主题资源应用于多个主题定义的简单方法是什么?
理想情况下,可以将一种资源应用于主题的方式与将样式应用于视图的方式相同,这将导致以下形式的解决方案:
<style name="MyApp.DialogWhenLarge.Light" parent="android:Theme.Material.Light.DialogWhenLarge">
<item name="themedResources">[pointer to canonical list of light theme resources]
</style>
Run Code Online (Sandbox Code Playgroud)
当然,任何解决方案都必须保留以以下格式从视图引用主题资源的功能,这一点也很重要。 ?themeBackground