【问题标题】: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,这一切都会自动处理!但如果它就像普通应用程序屏幕上的切换,你必须自己存储它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 2021-03-05
      • 2020-07-07
      • 2021-06-25
      • 2020-10-20
      • 1970-01-01
      相关资源
      最近更新 更多