为了更好的用户体验,如知乎、简书等阅读类的App都加入了切换夜间模式的功能。今天,就来学习下夜间模式的一种实现方式。
前言
- 原来Google官方对夜间模式支持并不给力,大家也想出各种方案来实现。然鹅,通过查阅相关资料,发现现在Google已经提供了对夜间模式的支持:使用Theme.AppCompat.DayNight主题便可以轻松实现。
具体使用
- 1 将我们主体继承Theme.AppCompat.DayNight
<style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
- 2 在我们应用Application中初始化主题
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
}
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.XXXX);这个方法有四个参数可以选择,如下:
- MODE_NIGHT_NO 不使用夜间模式(亮色主题)
- MODE_NIGHT_YES 使用夜间模式(暗色主题)
- MODE_NIGHT_AUTO 自动切换日间和夜间模式
- MODE_NIGHT_FOLLOW_SYSTEM 跟随系统的模式
其中自动模式是使用到定位API,以计算出准确的日出和日落的事件
- 3 切换日间和夜间模式(即主体的切换)
- (1)获取当前主题
int mode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
- (2)根据当前主题决定切换日间或者夜间模式
if (mode == Configuration.UI_MODE_NIGHT_YES) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
} else if (mode == Configuration.UI_MODE_NIGHT_NO){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
效果如下:
- 4 夜间模式下资源的适配
在上图中我们发现,切换主题后,textView字体颜色还是黑色,看不清。
其实不管颜色还是图片都可以跟随主题变化的,做法如下: - 这里以文字颜色为例,在res建立values-night的文件夹,将colors.xml文件考入,并且修改夜间模式下我们想要替换的颜色,效果如下:
现在文字颜色也变化了,至于其他资源的替换做法也是类似的