我想在我的应用程序中实现一个切换黑暗模式的开关。在研究了如何正确执行此操作的多个源之后,我遇到了一个单行解决方案:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);不幸的是,在我的例子中,这只会将配置更改为光照模式,而不会更新UI颜色。这是我的密码:
binding.toggleDarkMode.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
activity?.recreate()
}
}我也想提到,我有单独的主题文件为光明和黑暗模式。光主题扩展Theme.Material3.Light.NoActionBar,暗主题扩展Theme.Material3.Dark.NoActionBar。有人能告诉我问题出在哪里吗?
发布于 2022-11-17 12:43:21
基本上,我手机的操作系统在MUI设备上覆盖了我的应用程序的样式。以下是完整的答案:无法在我的应用程序中禁用夜间模式,即使使用值-夜晚
发布于 2022-11-11 18:56:24
您张贴的那一行显式地将主题设置为光模式。
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)或者换个说法,“不是夜模式”。
如果您希望它切换,则需要获取当前模式(光或暗)并将其设置为另一模式:
// check the mode
val isDarkMode = AppCompatDelegate.getDefaultNightMode() == NIGHT_MODE_YES
// set the other
AppCompatDelegate.setDefaultNightMode(if (isDarkMode) NIGHT_MODE_NO else NIGHT_MODE_YES)或者,如果您依赖于开关状态,只需执行if (isChecked),就不需要get当前模式。
这里有两个以上的模式--顺便说一句,我们建议您也处理“跟踪系统”--但这取决于您--一个开发人员提供了更多关于整个这里的信息。
当你的应用程序启动时,你也需要尽早调用setDefaultNightMode,这样它就可以被正确地主题化--例如在一个自定义的Application类中,尽管如果你在做一个单一活动的应用程序,你也可以把它放在onCreate中。否则,它将需要进入每一个Activity,以防万一这是第一个创建时,应用程序被打开/恢复。
但是这意味着,你必须存储亮/暗设置的,这样它就可以在应用程序启动时被读取--它不会“粘”到你设置的最后一个东西上。您可以使用SharedPreferences进行此操作,如果您的开关是一个实际的Preference,则所有这些都是自动处理的!但是,如果它就像普通应用程序屏幕上的切换,你必须自己存储它
编辑我知道有件事我想提-你不需要做activity?.recreate(),setDefaultNightMode会为你处理如果它是必要的(即如果有变化)
https://stackoverflow.com/questions/74406316
复制相似问题