系列文章:
《Android 夜间模式系列笔记(二)通过更换主题实现夜间模式》
Support Library 23.2在AppCompat 加入了新的主题:Theme.AppCompat.DayNight,使应用可以很便捷的实现日夜模式。
使用方式:
1.引入support包(版本需要大于23.2)
compile 'com.android.support:appcompat-v7:26.+'
2.主题继承Theme.AppCompat.DayNight
<resources>
<!-- Base application theme. -->
<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>
</resources>
3.资源文件加添加XXX-night的文件夹,并添加需要设置夜间模式的资源
比如上面的颜色资源可以这样设置
res/values/colors.xml(白天)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="app_bg_color">#FFFFFF</color>
<color name="text_color">#000000</color>
</resources>
res/values-night/colors.xml(夜间)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="app_bg_color">#000000</color>
<color name="text_color">#FFFFFF</color>
</resources>
4.设置日夜间模式
通过调用AppCompatDelegate.setDefaultNightMode(mode),可以设置全局的夜间模式(进程)
通过调用getDelegate().setLocalNightMode(mode),可以设置局部的夜间模式(当前组件)
设置完后,需要调用recreate()重启activity
mode的取值有四种:
AppCompatDelegate.MODE_NIGHT_NO :白天模式
AppCompatDelegate.MODE_NIGHT_YES :夜间模式
AppCompatDelegate.MODE_NIGHT_AUTO :根据当前时间自动切换日夜间模式(比如北京时间22:00会自动切换为夜间)
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM :跟随系统
5.初始化模式
可以在application里面设置
static {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_ NIGHT_YES);
}
或者在oncreate里面恢复上一次保存的状态值
int nightMode = SharedPrefUtil.getInstance().getNightMode();
AppCompatDelegate.setDefaultNightMode(nightMode);
6.需要注意的问题
(1)如果启动时设置为夜间模式,可能会先闪过一个白色页面才进入夜间模式
解决办法: 去掉默认的窗口背景色
<item name="android:windowBackground">@null</item>
(2)调用recreate()重启activity,需要注意保存当前的数据,然后恢复
(3)对于多个activity,如果是设置的全局的夜间模式,则所有的activity都需要调用一次recreate,否则没有调用的页面是不会生效的
demo链接:https://github.com/swustmuzi/PNightMode