在 Android Studio 中以编程方式从应用程序触发系统的暗模式

Posted

技术标签:

【中文标题】在 Android Studio 中以编程方式从应用程序触发系统的暗模式【英文标题】:Trigger Dark mode of System from application programmatically in Android Studio 【发布时间】:2021-11-10 04:12:47 【问题描述】:

我只是想知道有没有什么语法可以触发手机内部的暗模式,我知道我应该使用SharePreferences来保存我的手机中的暗模式状态,但我想要的是,有没有什么功能在我的整个移动视图中触发暗模式,而不仅仅是我创建的应用程序。实现darkmode 的最佳方式是什么?是sharedPref

我不想在设置中手动点击darkmode,而是想通过我的应用按钮触发darkmode,这可能吗?

我刚刚尝试过,但结果是,它仅在我的应用程序中触发了暗模式,而不是在整个移动设备上。感谢您的帮助。

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

【问题讨论】:

见this @Sniffer 感谢您的回复,但我已经尝试过了,是的,它确实在应用程序中应用了暗模式,但它没有在您的整个手机上应用暗模式 【参考方案1】:

走向黑暗面:黑暗主题回顾

Offical Documents by Yaroslav Berezanskyi

控制级别。向后兼容性

深色主题有 3 个级别的控制:

    系统设置 应用设置 活动设置

1.系统设置:

这是一个全局设置,由用户显式或隐式控制(通过切换省电模式)。

改变它的方法有限:

深色主题切换(设置->显示->深色主题) — 引入 android Q (API 29); 夜间模式开发者选项(设置->系统->开发者 选项->夜间模式)- 仅适用于 Android P (API 28)。 省电模式。向后兼容 Android Lollipop (API 21)。一些 EOM 可能不支持。

此设置应用于系统级别,包括所有系统 UI 和应用程序。更改设置后,您的应用程序会收到Application.onConfigurationChange 回调,并且所有活动都会立即重新创建。但是,您的应用程序可以跟随它还是用本地的覆盖它(应用程序或活动范围的设置)。

2。应用设置:

作为一个好公民,您可以让用户在应用内的主题之间进行选择(覆盖系统设置)。

将通过您的自定义小部件使用AppCompatDelegate.setDefaultNightMode API 进行控制(通常是设置屏幕中的 ListPreference)。

推荐的选项是:

光 黑暗 由省电模式设置。它向后兼容 API 21 (the API 21–27 的推荐默认选项) 系统默认(API 28 及更高版本推荐的默认选项)

此外,您可以将 Light 设置为默认值,并将 API 的最后 2 个选项隐藏在 21 以下,因为它们都不支持。

每个选项都直接映射到 AppCompat.DayNight 模式之一:

灯光 — MODE_NIGHT_NO 黑暗 — MODE_NIGHT_YES 由省电模式设置 — MODE_NIGHT_AUTO_BATTERY 系统默认值 — MODE_NIGHT_FOLLOW_SYSTEM

更改设置后,所有已启动的活动都会重新创建(或获取Activity.onConfigurationChange 回调,如果您选择在清单中手动处理配置更改)。

3.活动设置:

它与应用程序设置非常相似,但仅适用于使用 getDelegate().setLocalNightMode. 的特定活动。请注意,任何调用它都会触发活动重新创建(如果主题更改)。正如 Chris Banes 建议的 here,您应该更喜欢 AppCompatDelegate.setDefaultNightMode,因为它可以最大限度地减少不必要的娱乐。

【讨论】:

以上是关于在 Android Studio 中以编程方式从应用程序触发系统的暗模式的主要内容,如果未能解决你的问题,请参考以下文章

在 Android Studio 中以编程方式从应用程序触发系统的暗模式

我可以在 Visual Studio 2012 中以编程方式折叠/展开某个名称的所有预处理器块吗?

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

在android中以编程方式获取屏幕密度?

如何在android中以编程方式启用位置访问?

多个ListViews在android中以编程方式创建