Android Q 中的深色主题配置更改

Mar*_*aie 6 android kotlin-android-extensions android-10.0 android-dark-theme

我想在我的应用程序中实现 android 10 深色主题,我有以下情况:

SYSTEM_DEFAULT, NIGHT_MODE, LIGHT_MODE

问题是当我从应用程序内部将主题从夜晚或灯光更改为 system_default 时,它无法理解系统是处于亮模式还是暗模式。所以主题不会更新。

我已经尝试过谷歌的黑暗主题 https://developer.android.com/guide/topics/ui/look-and-feel/darktheme

并且实施配置仍然对我不利,因为如果用户在系统默认为天时将天更改为系统默认值,我不想重新创建我的活动。

反正我能处理这个吗?

when(id) {
  NIGHT - > theme = Theme.NIGHT_MODE
  DAY - > theme = Theme.LIGHT_MODE
  SYSTEM_DEFAULT - > theme = Theme.SYSTEM_DEFAULT
}

context ? .clearCachedDrawables()
activity ? .recreate()
}
Run Code Online (Sandbox Code Playgroud)

编辑:

when (themeStatus) {
            Theme.LIGHT_MODE ->
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
            Theme.NIGHT_MODE ->
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
            Theme.SYSTEM_DEFAULT ->
               AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
        }
Run Code Online (Sandbox Code Playgroud)

Luc*_*ano 7

您不需要在您的活动中设置主题并重新创建它。如果您正确设置了应用主题,它会自动完成。

要在您的应用中使用 Dark,您应该将 DayNight 主题扩展为您的应用主题。

<style name="AppTheme" parent="Theme.AppCompat.DayNight"> 
Run Code Online (Sandbox Code Playgroud)

或者

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
Run Code Online (Sandbox Code Playgroud)

例如,如果您想在暗模式下使用不同的颜色,您应该创建一个名为 values-night 的“Android 资源目录”,并使用一个名为“colors.xml”的“资源文件”

在colors.xml 中,您可以为现有颜色之一设置不同的颜色十六进制。

例如:

values/colors.xml 包含

<color name="myColor">#000000</color>
Run Code Online (Sandbox Code Playgroud)

values-night/colors.xml 包含

<color name="myColor">#FFFFFF</color>
Run Code Online (Sandbox Code Playgroud)

编辑

您可以通过调用在应用程序中在暗/亮模式之间切换

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
Run Code Online (Sandbox Code Playgroud)

或者

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
Run Code Online (Sandbox Code Playgroud)

或者

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
Run Code Online (Sandbox Code Playgroud)

  • 我已经这样做了,问题是当我将主题从浅色更改为系统默认值并且系统处于夜间模式时,应用程序不会更新到夜间模式,尽管它重新创建了活动 (2认同)
  • 是的,我的目标是为用户提供上面提到的选项(浅色,深色,系统默认值),我希望用户选择系统默认值,我的应用程序应该应用当时系统默认值的状态 (2认同)
  • 我也已经这样做了,正如我所说的“AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)”此代码不起作用。当主题从“MODE_NIGHT_YES”或“MODE_NIGHT_NO”更改为“MODE_NIGHT_FOLLOW_SYSTEM”时,应用不会收到通知 (2认同)
  • 即使稳定的 AppCompat 1.1.0 版本我也有同样的问题 (2认同)