Android:如何切换黑暗模式的主题?

mar*_*337 6 android android-theme android-dark-theme android-darkmode

从 Android 10 开始,您可以在暗模式和默认亮模式之间切换。我还没有对此进行更深入的研究,因为这是一个新话题。暗模式颜色是由操作系统自动切换的,还是有什么方法可以告诉我的应用程序在暗模式打开时切换不同的应用程序主题?某些 Android 9 设备也可以使用暗模式。

因为我使用自定义参数制作了自定义深色主题,并且我为资源中的每种颜色设置了深色(使用自定义属性attrs.xml并将特定颜色资源应用于主题中的主题styles.xml)。同样它适用于我的应用程序的不同配色方案(例如蓝色、红色、绿色)。这样我就可以知道我的应用程序而不是系统中的不同视图将使用哪种颜色。

我唯一需要做的就是检测系统中是否开启/关闭暗模式。我可以强制用户在应用设置(自定义设置)中打开暗模式,但主题可能会受到系统暗模式(在手机设置中打开)的影响。

Ali*_*ghi 9

官方文件

为了支持深色主题,您必须将应用的主题(通常在 res/values/styles.xml 中找到)设置为从 DayNight 主题继承:

<style name="AppTheme" parent="Theme.AppCompat.DayNight">
Run Code Online (Sandbox Code Playgroud)

您还可以使用 MaterialComponents 的深色主题:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
Run Code Online (Sandbox Code Playgroud)

这将应用程序的主题与系统控制的夜间模式标志联系起来,并为应用程序提供默认的深色主题(启用时)。

这意味着如果您使用 DayNight 主题,操作系统本身会处理应用程序主题。如果您想强制应用程序使用深色主题,请查看文档。

更新:

检测设备主题:

switch (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) {
    case Configuration.UI_MODE_NIGHT_YES:
        …
        break;
    case Configuration.UI_MODE_NIGHT_NO:
        …
        break; 
}
Run Code Online (Sandbox Code Playgroud)