【问题标题】:Android Night Mode Follow System does not work correctlyAndroid 夜间模式跟随系统无法正常工作
【发布时间】:2020-05-25 11:08:57
【问题描述】:

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

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

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

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

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.) 当我将我的应用程序设置为跟随系统,然后我手动切换到浅色模式(在应用程序中)然后返回跟随系统时,即使我的手机处于系统范围的深色主题中,我的应用程序也会保持浅色。但是,当切换我的应用主题时,它确实会发生变化。

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

【问题讨论】:

    标签: android android-layout android-dark-theme android-darkmode


    【解决方案1】:

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

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

    enter image description here

    在默认文件夹中设置为 false

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

    enter image description here

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

    希望对你有帮助。

    【讨论】:

      【解决方案2】:
                  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)
      

      【讨论】:

      • SO上有一些线程,人们陈述了同样的问题。当您的手机处于暗模式 span>时,我的主题在选择后,我的主题不会从灯光到暗变为黑暗。
      • 为了使更改立即生效,您需要重新启动活动,请查看上面的代码。我添加了更多详细信息
      • 它适用于例如汽车电池。真奇怪。我将我的应用程序主题更改为跟随系统,它无法识别系统主题,但尝试使用节电模式并且它可以工作。我认为这是 API 的一些问题
      • 其实,能否请你在更改主题的地方添加代码
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2015-08-24
      • 2017-10-27
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多