我正在使用Theme.Material.Components.DayNight主题来实现我的应用的深色模式。
问题是我的深色模式将仅与深色组件相结合,而我的“浅色”模式将与混合的深色和浅色组件相结合。因此,当应用默认模式设置为Light时,我需要以某种方式访问暗色主题属性。你能帮我解决这个问题吗?
我考虑设置自定义主题“DarkThemeInLight”,并将其分配给应该为深色的视图,但这是否是一个好方法?如果我直接在该主题定义中设置颜色,我将从colors.xml(夜间)中重复几乎一半的代码。
我考虑的方法:
更新于2020年4月6日: 最终,我成功地实现了我所提到的效果。由于定义了两个独立的AppTheme和AppTheme.Dark样式,我能够将一些组件呈现为浅色,另一些组件呈现为暗色,但我的解决方案排除了在浅色和暗色模式之间切换的可能性,因此我的问题仍然存在。
我考虑设置自定义主题“DarkThemeInLight”,并将其分配给应该为深色的视图,但这是否是一个好方法?如果我直接在该主题定义中设置颜色,我将从colors.xml(夜间)中重复几乎一半的代码。
我考虑的方法:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorSecondary">@color/colorSecondary</item>
<item name="android:colorBackground">@color/colorBackground</item>
<item name="colorSurface">@color/colorSurface</item>
<item name="colorError">@color/colorOnError</item>
<item name="colorOnPrimary">@color/colorOnPrimary</item>
<item name="colorOnSecondary">@color/colorOnSecondary</item>
<item name="colorOnBackground">@color/colorOnBackground</item>
<item name="colorOnSurface">@color/colorOnSurface</item>
<item name="colorOnError">@color/colorOnError</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="drawerArrowStyle">@style/DrawerIcon</item>
<item name="textAppearanceSubtitle1">@style/TextAppearance.MyTheme.Subtitle1</item>
<item name="textAppearanceSubtitle2">@style/TextAppearance.MyTheme.Subtitle2</item>
<item name="textAppearanceCaption">@style/TextAppearance.MyTheme.Caption</item>
<item name="android:colorControlActivated">@color/colorPrimary</item>
</style>
<style name="DarkThemeInLight" parent="AppTheme">
<item name="android:colorBackground">@night/colorsBackground</item> (Can i call night folder somehow?)
or
<item name="android:colorBackground">#121212</item> (Value from night colors folder)
...
</style>
更新于2020年4月6日: 最终,我成功地实现了我所提到的效果。由于定义了两个独立的AppTheme和AppTheme.Dark样式,我能够将一些组件呈现为浅色,另一些组件呈现为暗色,但我的解决方案排除了在浅色和暗色模式之间切换的可能性,因此我的问题仍然存在。
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorSecondary">@color/colorSecondary</item>
<item name="android:colorBackground">@color/colorBackground</item>
<item name="colorSurface">@color/colorSurface</item>
<item name="colorError">@color/colorError</item>
<item name="colorOnPrimary">@color/colorOnPrimary</item>
<item name="colorOnSecondary">@color/colorOnSecondary</item>
<item name="colorOnBackground">@color/colorOnBackground</item>
<item name="colorOnSurface">@color/colorOnSurface</item>
<item name="colorOnError">@color/colorOnError</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:statusBarColor">@color/colorSurfaceNight</item>
<item name="android:navigationBarColor">@color/colorSurfaceNight</item>
<item name="android:navigationBarDividerColor" tools:targetApi="o_mr1">
@color/colorSurfaceNight
</item>
<item name="drawerArrowStyle">@style/DrawerIcon</item>
<item name="textAppearanceSubtitle1">@style/TextAppearance.MyTheme.Subtitle1</item>
<item name="textAppearanceSubtitle2">@style/TextAppearance.MyTheme.Subtitle2</item>
<item name="textAppearanceCaption">@style/TextAppearance.MyTheme.Caption</item>
<item name="android:colorControlActivated">@color/colorPrimary</item>
</style>
<style name="AppTheme.Dark" parent="Theme.MaterialComponents">
<item name="colorPrimary">@color/colorPrimaryNight</item>
<item name="android:colorBackground">@color/colorBackgroundNight</item>"
<item name="colorSecondary">@color/colorSecondaryNight</item>
<item name="colorSurface">@color/colorSurfaceNight</item>
<item name="colorError">@color/colorErrorNight</item>
<item name="colorOnPrimary">@color/colorOnPrimaryNight</item>
<item name="colorOnSecondary">@color/colorOnSecondaryNight</item>
<item name="colorOnBackground">@color/colorOnBackgroundNight</item>
<item name="colorOnSurface">@color/colorOnSurfaceNight</item>
<item name="colorOnError">@color/colorOnErrorNight</item>
</style>
```
@night/colorsBackground
都是不可能的。 - Gabriele MariottiTheme.MaterialComponents.DayNight
定义单一主题,然后在资源文件夹上使用**-night
限定符**,如drawable-night
和values-night
来定义暗黑主题的值。 - Gabriele Mariotti<item name="android:colorBackground">#121212</item>
- Swierszczu