自从2019年的Google大会之后,在Android Q(即API Level 29)的手机版本上系统就支持了暗黑模式。
怎么开启暗黑模式?
在Android Q手机上面,即Android 系统版本为10的手机上面,直接可以在我们的系统设置里面去打开暗黑模式,以华为手机为例,具体位置为: 设置 ——> 显示 ——> 深色模式,即完成了暗黑模式开启。
forceDarkAllowed
样式中设置 android:forceDarkAllowed 属性,深色主题下系统会自动进行适配。
新建 values-v29 目录,因为 android:forceDarkAllowed 属性 Android 10开始才有。
设置 android:forceDarkAllowed 属性为true
从布局文件中可以看到,并没有设置任何背景色,但深色主题下,APP自动进行了适配。
这种适配方式十分简单,但是不够美观,无法自定义控件颜色样式,全凭系统控制,并不推荐这种自动化方式实现深色模式。
官方推荐另外一种方法,即分别创建浅色和深色的主题样式。
新建 values-night 目录,存放深色主题的样式
与 forceDarkAllowed 最大的区别在于,深色主题可以手动设置颜色样式。
一些常用的方法:
判断深色主题
public static boolean isDarkTheme(Context context) {
int flag = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
return flag == Configuration.UI_MODE_NIGHT_YES;
}
代码中切换深色主题
if (isDarkTheme(MainActivity.this)) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
禁止界面适配深色主题
Activity 的 configChanges 属性当中配置 uiMode 避免Activity 重新创建,从而阻止界面适配深色主题。
<activity
android:exported="true"
android:name=".MainActivity"
android:configChanges="uiMode">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
如果不想页面随着系统设置变化就尽量不要使用DayNight主题,换成Light 就完全不受系统影响了
theme主题不能继承Dark Theme和DayNight主题,只能继承除此以外的其他主题,譬如 Theme.AppCompat.Light.DarkActionBar。如果使用了Dark Theme主题,则系统不会应用Force Dark。同样,如果使用了DayNight主题,系统也不会应用Force Dark主题。即如果使用的是 DayNight或 Dark Theme 主题,则设置forceDarkAllowed 不生效。
forceDarkAllowed 的含义是是否强制允许使用暗黑效果,如果设置true,则代表可以强制更改为暗黑效果,当前应用的效果随着系统的改变而改变;如果设置为false,则代表不可以强制更改为暗黑效果,当前应用的效果随着系统的改变而不会有任何改变。
系统提供的mode有以下几种模式: 浅色: MODE_NIGHT_NO 深色:MODE_NIGHT_YES 由省电模式设置:MODE_NIGHT_AUTO_BATTERY 系统默认:MODE_NIGHT_FOLLOW_SYSTEM 而设置的方法也很简单:
AppCompatDelegate.setDefaultNightMode(int num);