【问题标题】:Android Material3 toggle dark mode on clickAndroid Material3在点击时切换暗模式
【发布时间】:2022-11-12 12:52:53
【问题描述】:
我想在我的应用程序中实现一个切换暗模式的开关。在调查了有关如何正确执行此操作的多个来源之后,我遇到了这个单行解决方案:
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。谁能告诉我可能是什么问题?
【问题讨论】:
标签:
android
kotlin
darkmode
material3
lightmode
【解决方案1】:
您发布的那一行明确将主题设置为浅色模式
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 当前模式。
顺便说一句,有两种以上的模式,建议您也处理“跟随系统”模式,但这取决于您 - 来自一位开发人员的更多信息here。
它还涉及到您需要在应用程序启动时尽早调用setDefaultNightMode,以便可以正确设置主题 - 例如在自定义的Application 类中,虽然如果你正在做一个单一活动的应用程序,你也可以把它放在onCreate 那里。否则,它需要进入每个Activity,以防这是在打开/恢复应用程序时首先创建的那个。
但这意味着您必须存储明暗设置因此可以在应用程序启动时读取它 - 它不会“坚持”到您设置的最后一件事。您可以为此使用SharedPreferences,如果您的开关是实际的Preference,这一切都会自动处理!但如果它就像普通应用程序屏幕上的切换,你必须自己存储它