【问题标题】:Android - How to detect if night mode is on when using AppCompatDelegate.MODE_NIGHT_AUTOAndroid - 如何在使用 AppCompatDelegate.MODE_NIGHT_AUTO 时检测夜间模式是否开启
【发布时间】:2017-05-24 23:28:11
【问题描述】:

我正在使用内置日/夜模式功能的 Android,我想在我的应用中为AppCompatDelegate.MODE_NIGHT_AUTO添加一个选项

我遇到了一个问题,因为我的应用程序需要以编程方式对某些内容进行着色,而且我不知道如何检查应用程序是否认为自己处于夜间或白天模式。没有它,我无法设置标志来选择正确的颜色。

调用 AppCompatDelegate.getDefaultNightMode() 只会返回 AppCompatDelegate.MODE_NIGHT_AUTO,这是没用的。

我没有看到其他可以告诉我的信息,但一定有什么?

【问题讨论】:

标签: android android-night-mode


【解决方案1】:
int nightModeFlags =
    getContext().getResources().getConfiguration().uiMode &
    Configuration.UI_MODE_NIGHT_MASK;
switch (nightModeFlags) {
    case Configuration.UI_MODE_NIGHT_YES:
         doStuff();
         break;

    case Configuration.UI_MODE_NIGHT_NO:
         doStuff();
         break;

    case Configuration.UI_MODE_NIGHT_UNDEFINED:
         doStuff();
         break;
}

【讨论】:

  • 谢谢,成功了。我开始检查颜色字符串值以查看它来自哪个资源文件,但这更好!
  • 请引用您的来源。 stackoverflow.com/questions/41391404/…
  • @StarWind0 我没有找到任何其他答案;这个答案完全来自 API 文档。
【解决方案2】:

如果你是 kotlin 开发者,那么你可以使用下面的代码来判断暗模式。

when (context.resources?.configuration?.uiMode?.and(Configuration.UI_MODE_NIGHT_MASK)) {
    Configuration.UI_MODE_NIGHT_YES -> {}
    Configuration.UI_MODE_NIGHT_NO -> {}
    Configuration.UI_MODE_NIGHT_UNDEFINED -> {}
}

有关深色主题模式的更多信息

https://github.com/android/user-interface-samples/tree/main/DarkTheme

【讨论】:

  • 你的时间并不详尽,否则对于欠精细的情况会更好
  • 很好的解决方案,正是我需要的
  • 嗨,现在我们不需要在 Kotlin 中翻译每个问题的答案,因为 IDE 会自动进行转换。无论如何感谢您的努力,尽管遗憾的是它只会产生不必要的滚动:(
【解决方案3】:

一个非常简单的解决方案是像这样添加一个字符串资源。

res/values/strings.xml

<string name="mode">Day</string>

res/values-night/strings.xml

<string name="mode">Night</string>

然后无论您需要检查它:

if (resources.getString(R.string.mode) == "Day") {
    // Do Day stuff here
} else {
    // Do night stuff here
}

但是在活动的生命周期中,您不能在 super.onCreate() 之前调用它。它总是在onCreate 之前返回“Day”。

【讨论】:

    【解决方案4】:

    Java 中的按位运算符(在 @ephemient 的答案中使用)是不同的 在 kotlin 中,因此代码对于初学者来说可能不容易转换。这是 kotlin 版本,以防万一有人需要它:

        private fun isUsingNightModeResources(): Boolean {
            return when (resources.configuration.uiMode and 
    Configuration.UI_MODE_NIGHT_MASK) {
                Configuration.UI_MODE_NIGHT_YES -> true
                Configuration.UI_MODE_NIGHT_NO -> false
                Configuration.UI_MODE_NIGHT_UNDEFINED -> false
                else -> false
        }
    }
    

    【讨论】:

      【解决方案5】:

      对于 Xamarin.Android

      if (Build.VERSION.SdkInt >= BuildVersionCodes.Froyo)
      {
          var uiModeFlags = Application.Context.Resources.Configuration.UiMode & UiMode.NightMask;
          switch (uiModeFlags)
          {
              case UiMode.NightYes:
                  // dark mode
                  break;
              case UiMode.NightNo:
                  // default mode
                  break;
              default:
                  // default mode
                  break;
          }
      }
      else
      {
      // default mode
      }
      

      【讨论】:

        【解决方案6】:

        也许只是一个属性,它会告诉你是否有暗模式?

        val Context.isDarkMode
            get() = if (getDefaultNightMode() == MODE_NIGHT_FOLLOW_SYSTEM)
                resources.configuration.uiMode and UI_MODE_NIGHT_MASK == UI_MODE_NIGHT_YES
            else getDefaultNightMode() == MODE_NIGHT_YES
        

        【讨论】:

          【解决方案7】:

          当我尝试在每个答案代码中获取当前主题时,我的 UI 测试出现问题。它每次都返回相同的值。

          所以我在 应用程序类 中创建静态变量并获取 UI 测试的主题抛出它:

          @Theme
          fun Context.getAppTheme(): Int? {
              val theme = when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
                  Configuration.UI_MODE_NIGHT_NO -> Theme.LIGHT
                  Configuration.UI_MODE_NIGHT_YES -> Theme.DARK
                  else -> null
              }
          
              Application.theme = theme
          
              return theme
          }
          

          在应用程序类中:

          companion object {
              @Theme
              @RunNone var theme: Int? = null
          }
          

          可能对某人有用!

          【讨论】:

            【解决方案8】:

            在将应用程序更改为深色主题后,我发现没有任何效果

            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            

            用这种方法更改应用后有什么方法可以知道系统设置吗?
            谢谢,
            FF

            【讨论】:

            • 对于我的问题here,任何有相同“问题”的人都有答案。
            猜你喜欢
            • 1970-01-01
            • 2020-10-04
            • 1970-01-01
            • 1970-01-01
            • 2019-12-02
            • 1970-01-01
            • 1970-01-01
            • 2016-01-21
            • 1970-01-01
            相关资源
            最近更新 更多