Android的Support Lib 23.2.0新增了主题:Theme.AppCompat.DayNight,可以用来实现夜间模式。
一、获取当前夜间模式
夜间模式有四种:MODE_NIGHT_NO、MODE_NIGHT_YES、MODE_NIGHT_AUTO、MODE_NIGHT_FOLLOW_SYSTEM 。 判断当前的模式代码如下:
int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
// Night mode is not active, we're in day time
case Configuration.UI_MODE_NIGHT_YES:
// Night mode is active, we're at night!
case Configuration.UI_MODE_NIGHT_UNDEFINED:
// We don't know what mode we're in, assume notnight
}
二、使用夜间主题
使用夜间主题很简单,首先把当前主题改为夜间主题。
<style name="MyTheme" parent="**Theme.AppCompat.DayNight**">
<!-- Blah blah -->
</style>
然后代码启用夜间模式。 整个应用启用夜间模式:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_...); //静态方法
当前组件启用夜间模式:
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_...); //实例方法
注意:
1.夜间模式的设置值并不是持久化的,每次进入都需要重新设置。
2.设置了夜间模式后,当前界面并不会变化,需要调用recreate()
方法重新渲染。
3.对于整个应用范围的夜间模式,我们可以把启动夜间模式的代码放在Application的静态方法块里。
public class MyApplication extends Application {
static {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_...);
}
}
三、使用自定义的夜间资源
给View设置颜色等等尽量采用当前主题对应的属性。 如果想要使用自定义的颜色等等。新增drawable-night, values-night等文件夹,把自定义的夜间资源放在对应的文件夹下。
四、该主题的缺点
无法使WebView加载的内容也处于夜间模式下。
参考: