今天我们就来了解一下AndroidQ的亮点之一——深色主题,它作为官方主推的亮点之一,有如下几个优点:
1、可大幅减少耗电量(具体取决于设备的屏幕技术)。
2、为弱视以及对强光敏感的用户提高可视性。
3、让所有人都可以在光线较暗的环境中更轻松地使用设备
我们在设置->显示->深色模式可以找到它的开关。
那是不是所有app都需要适配这个模式呢,答案是否定的,只有你的app想要给用户深浅模式的选择时,才需要进行适配(当然这只是深浅模式的一种实现方式)。
首先我们介绍一种最简单的适配方案,如果你的app当前是浅色主题背景(比如Theme.AppCompat.Light),那么你可以直接在其主题设置中加上下面的设置
android:forceDarkAllowed="true"
如果你直接在value/style.xml文件中加入这个配置,系统会提示你把配置放到values-v29目录下,因为这个配置只会在target29的机器上生效,同时,记得把compileSdkVersion指定为29。完了之后你就可以重新编译了。安装app,打开系统设置,切换深色模式,你将看到一套深色的UI。
以上是系统自动帮你做的适配,但如果你使用的主题是深色主题或者系统适配出来的效果达不到你的预期,那么你可以选择下面一种方式手动适配。
首先,你必须将应用的主题背景(通常可在 res/values/styles.xml 中找到)设置为继承 DayNight 主题背景:
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
然后,就是对资源目录进行适配,通常是在资源文件夹的名字加-night,比如values-night,然后,我们就可以在这个文件夹下将需要适配的文件进行拷贝,替换。举个例子。比如现在我们有个Textview,它的textColor属性我采用软编码的方式,在color.xml文件中定义为id为main_text_color的颜色资源,如果我需要对这个Textview的textColor进行适配,那我就需要在values-night/color.xml中也定义一个id为main_text_color的颜色资源,然后给它指定深色模式下的颜色值。drawable下的文件适配也是同理。
默认情况下,app的深浅模式是跟随系统的,我们也可以在app内部对深浅模式进行指定,如下
AppCompatDelegate.setDefaultNightMode();
它接受4个int型的参数:
浅色 - MODE_NIGHT_NO
深色 - MODE_NIGHT_YES
由省电模式设置 - MODE_NIGHT_AUTO_BATTERY
系统默认 - MODE_NIGHT_FOLLOW_SYSTEM
默认情况下,深浅模式切换会导致界面的重新创建(和语言切换或横竖屏切换一样 ),所以如果我们有不希望重新创建的界面,可以在清单文件中对应的组件配置uiMode,如下
<activity
android:name=".MyActivity"
android:configChanges="uiMode" />
然后在MyActivity重写onConfigurationChanged() 方法,这样,当有深浅模式切换时,界面就不会重新创建,而是回调onConfigurationChanged() 方法,你需要自己去处理相应的逻辑,我们可以通过如下方式获取当前的系统设置的深浅模式:
int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
// Night mode is not active, we're using the light theme
break;
case Configuration.UI_MODE_NIGHT_YES:
// Night mode is active, we're using dark theme
break;
}
OK,到这里,AndroidQ的深浅模式适配基本就完成了。