Android之夜间主题

973 阅读1分钟

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加载的内容也处于夜间模式下。

参考:

medium.com/@chrisbanes…

android-developers.blogspot.co.uk/2016/02/and…