5

我正在使用 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>
    ```
4

1 回答 1

7

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

  1. 在中创建values-night目录main/res/
  2. 复制colors.xml文件main/res/values/并粘贴到里面values-night
  3. 将颜色值更改main/res/values-night/colors.xml为深色。(不要更改名称,只需更改值)
  4. 使用应用风格中的颜色。
  5. 转到onCreatemainActivity 中的方法并使用此代码更改主题:

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

AppCompatDelegate.MODE_NIGHT_YES用于黑暗模式和AppCompatDelegate.MODE_NIGHT_NO白天模式。

于 2020-04-21T09:50:31.320 回答