人升开发日志#15 | 06/16 夜间模式
收到多次需要夜间模式的反馈,就研究了一下要怎么实现~
本以为需要手动替换Theme,实际上Android已经提供了相应的功能。
实际使用之后才发现,Fragment能实现到和Activity在使用上分辨不出的效果。
依赖
首先是依赖,需要使用appcompat:(我这里用的androidx库,support库同理)
1 | implementation 'androidx.appcompat:appcompat:1.1.0-beta01' |
准备资源
Activity的主题要继承自 DayNight 主题
1
2
3
4
5
6<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>创建values-night文件夹,并在里面放置一份相应的colors.xml
步骤:
- res文件夹右键 ->
New
->New Resource Directory
Directory name 输入
values-night
Resource type 输入
values
- 将原本的colors.xml复制一份到values-night文件夹内。
- res文件夹右键 ->
调整夜间模式内的颜色值。
编程实现切换
需要注意的是,这里切换没有考虑到状态的保留。用的是finish+startActivity+动画效果。
一开始使用recreate方法,发现会卡顿一下,而且没有动画效果。
切换按钮的逻辑
1 |
|
自定义Application的相应逻辑
1 | if (SharedPreferencesUtils.getStatusPreferencesInstance().getBoolean("isNightMode", false)) { |
难点
其实,夜间模式的实现并不困难。难的是:
- 相应的夜间模式颜色配置
- 切换实现流畅的动画效果
- 切换实现保留状态
- 切换后确保所有页面都是夜间模式
我这里是将夜间模式的按钮放在了主页的侧边栏,所以finish之后肯定是唯一一个activity,所以不用考虑残留页面的问题。
保留状态这一点也没有考虑,有需要的话可以参考一下https://juejin.im/entry/58eb498e0ce463005869dd3b
另外还有通过windowAnimation配合recreate的方法,但是实际测试好像动画不会生效。
人升开发日志#15 | 06/16 夜间模式