1

我在我的应用程序中使用 DayNight 材质主题实现了深色主题。我在互联网上关注了几篇文章和会议演讲。一切都很顺利,直到一些小事情开始发生。让我解释:

该应用程序有几个活动。为了不明确地为每个活动设置主题,我按照建议将初始主题设置放在我的应用程序的 onCreate() 方法中。不过,这有一个缺点,我将在下面解释。

1.) AppCompat 在活动级别实现夜间模式,这意味着它不会更新应用程序上下文(我用来设置主题应用程序范围)(来源:https ://issuetracker.google.com/issues/ 134379747 )

2.)建议使用以下代码来检查应用程序是否在哪种模式下运行。但在我的情况下,它返回完全相反的模式:

val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme
    Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme
}

3.)当我的应用程序设置为跟随系统,然后我手动切换到灯光模式(在应用程序中)然后返回跟随系统时,即使我的手机处于系统范围的黑暗主题,我的应用程序仍然保持明亮。但是,当切换我的应用程序主题时,它确实会发生变化。

我究竟做错了什么?可能的解决方案是将主题设置在活动级别上吗?

4

2 回答 2

2

在您的资源文件夹中,您可以使用以下代码在 value_night 文件夹中添加 bools.xml

<resources>
    <bool name="is_night_mode">true</bool>
</resources>

在此处输入图像描述

并在默认文件夹中设置为 false

  <resources>
        <bool name="is_night_mode">false</bool>
    </resources>

在此处输入图像描述

并在类文件中访问它,如 Boolean isNightTheme = context.getResources().getBoolean(R.bool.preferences_autoplay);

希望能帮助到你。

于 2020-05-25T12:22:48.673 回答
1
            when (resources.configuration.uiMode.and(Configuration.UI_MODE_NIGHT_MASK)) {
                Configuration.UI_MODE_NIGHT_NO -> themeLight.isChecked = true
                Configuration.UI_MODE_NIGHT_YES -> themeDark.isChecked = true
                Configuration.UI_MODE_NIGHT_UNDEFINED -> themeLight.isChecked = true
            }

使用上面的代码获取当前主题。为了立即更改主题,您需要添加

 AppCompatDelegate.setDefaultNightMode(themeMode)
于 2020-05-25T11:26:11.413 回答