首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >点击Android Material3切换黑暗模式

点击Android Material3切换黑暗模式
EN

Stack Overflow用户
提问于 2022-11-11 17:44:28
回答 2查看 46关注 0票数 0

我想在我的应用程序中实现一个切换黑暗模式的开关。在研究了如何正确执行此操作的多个源之后,我遇到了一个单行解决方案:

代码语言:javascript
复制
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

不幸的是,在我的例子中,这只会将配置更改为光照模式,而不会更新UI颜色。这是我的密码:

代码语言:javascript
复制
binding.toggleDarkMode.setOnCheckedChangeListener { _, isChecked ->
   if (isChecked) {
      AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
      activity?.recreate()
   }
}

我也想提到,我有单独的主题文件为光明和黑暗模式。光主题扩展Theme.Material3.Light.NoActionBar,暗主题扩展Theme.Material3.Dark.NoActionBar。有人能告诉我问题出在哪里吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-17 12:43:21

基本上,我手机的操作系统在MUI设备上覆盖了我的应用程序的样式。以下是完整的答案:无法在我的应用程序中禁用夜间模式,即使使用值-夜晚

票数 0
EN

Stack Overflow用户

发布于 2022-11-11 18:56:24

您张贴的那一行显式地将主题设置为光模式。

代码语言:javascript
复制
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)

或者换个说法,“不是夜模式”。

如果您希望它切换,则需要获取当前模式(光或暗)并将其设置为另一模式:

代码语言:javascript
复制
// 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会为你处理如果它是必要的(即如果有变化)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74406316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档