Android. 在浅色主题中使用深色调色板

6
我正在使用Theme.Material.Components.DayNight主题来实现我的应用的深色模式。 问题是我的深色模式将仅与深色组件相结合,而我的“浅色”模式将与混合的深色和浅色组件相结合。因此,当应用默认模式设置为Light时,我需要以某种方式访问暗色主题属性。你能帮我解决这个问题吗?
我考虑设置自定义主题“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 Mariotti
根据我的经验,最好的方法是使用Theme.MaterialComponents.DayNight定义单一主题,然后在资源文件夹上使用**-night限定符**,如drawable-nightvalues-night来定义暗黑主题的值。 - Gabriele Mariotti
@GabrieleMariotti 是的,我正在使用它。但是从colors-night文件夹中获取的值仅在使用深色模式时影响我的布局,而我需要在浅色模式下的某些视图上也使用它们。 - Swierszczu
我刚刚检查了我的方法,即使我直接分配颜色并将主题设置为视图,它也无法正常工作。 <item name="android:colorBackground">#121212</item> - Swierszczu
1个回答

8

我认为要解决这个问题,您需要执行以下步骤:

  1. main/res/ 目录下创建 values-night 文件夹。
  2. main/res/values/ 复制 colors.xml 文件并粘贴到 values-night 文件夹中。
  3. main/res/values-night/colors.xml 文件中将颜色值改为深色。(不要更改名称,只需更改值)
  4. 使用应用程序风格中的颜色。
  5. 进入 mainActivity 的 onCreate 方法,并使用以下代码更改主题:

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

AppCompatDelegate.MODE_NIGHT_YES 用于黑暗模式,AppCompatDelegate.MODE_NIGHT_NO 用于日间模式。


3
你是对的,但尽管手机已经设置了亮色模式选项,某些组件仍需要样式化为暗色。然而,在暗色样式中,所有组件都应该被样式化为暗色。 - Swierszczu
1
@Swierszczu,你是否使用主题叠加来设置深色主题表面在浅色主题上方以及反之亦然? - Marlon López

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接