我正在使用 Theme.Material.Components.DayNight 主题在我的应用程序中实现暗模式。问题是我的暗模式将纯粹与暗成分混合,而我的“亮”模式将与混合的暗和亮成分混合。因此,当应用程序默认模式设置为 Light 时,我需要以某种方式访问黑暗主题的属性。你能帮我解决我的问题吗?
我正在考虑设置自定义主题“DarkThemeInLight”并将其分配给应该是黑暗的视图,但这是一个好方法吗?如果我直接在该主题定义中设置颜色,我将重复来自 colors.xml(night) 的几乎一半代码。
我正在考虑的方法:
<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 年 6 月 4 日更新:
最终,我能够达到我提到的效果。由于两个独立的 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>
```