安卓:如何在暗黑模式下切换主题?

7
自Android 10以来,您可以在默认的浅色模式和深色模式之间切换。由于这是一个新话题,我还没有进行更深入的研究。黑暗模式的颜色是否由操作系统自动切换,还是有方法可以告诉我的应用程序在打开黑暗模式时切换不同的应用程序主题?一些Android 9设备也支持深色模式。
因为我使用自定义属性在attrs.xml中设置了资源的自定义参数,并在styles.xml的主题内应用特定的颜色资源,所以我制作了自定义的深色主题。同样适用于我的应用程序的不同颜色方案(例如蓝色、红色、绿色)。这样,我可以告诉我的应用程序在不同的视图中使用哪种颜色,而不是系统选择。
我唯一需要的是检测系统中深色模式是否开启或关闭。我可以强制用户在应用程序设置中打开深色模式,但主题可能会受到系统深色模式的影响(在手机设置中打开)。

3
你看过这个了吗? - a_local_nobody
1个回答

9

来自官方文档:

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

<style name="AppTheme" parent="Theme.AppCompat.DayNight">

您还可以使用MaterialComponents的暗色主题:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">

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

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

更新:

要检测设备主题:

switch (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) {
    case Configuration.UI_MODE_NIGHT_YES:
        …
        break;
    case Configuration.UI_MODE_NIGHT_NO:
        …
        break; 
}

会尝试这个。因为我之前提到过,如果我的应用有5种不同的颜色变化,我就必须为它们制作5种不同的深色主题。这意味着我必须根据应用当前使用的浅色主题选择哪种颜色主题。 - martin1337
@martin1337 请查看更新后的答案。您可以检测设备主题,并根据此设置您的应用程序主题。 - Ali Sadeghi
使用and运算符而不是&运算符在when()函数内部可以正常工作。我还在Android 10虚拟设备上进行了测试。我认为应该在onResume中调用此代码,因为只有在应用程序重新启动后主题才会切换。 - martin1337
1
@martin1337 不行,你需要在应用程序类中设置夜间模式。请查看问题中 a_local_nobody 的评论。 - Ali Sadeghi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接