目前主流的Android夜间模式有两种
第一种
官方api模式,参考
局限性在于每次切换夜间模式,栈中所有的Activity都会重启,相应的有很多保存、恢复操作。实现较为麻烦,不适合加入已具备繁重业务逻辑的项目中。
第二种
相比于官方api,Android-skin-support库不需要重启Activity,使用插件化方案更新资源
本文接下来会主要介绍Android-skin-support中插件式换肤的用法
step1.在本地工程下新建module-Android Lib
相应的包名应注意修改为***.night
例如:
主包名: com.ximsfei.skindemo
夜间模式包名: com.ximsfei.skindemo.night
step2.把新建的module修改成可打包的application
修改module下的build.gradle
apply plugin: 'com.android.library'
修改为
apply plugin: 'com.android.application'
step3.将需要换肤的资源放到res目录下(同名资源)
包含color、drawable、mipmap等资源
例如 背景颜色为
app/***/colors.xml
<color name="background">#ffffff</color>
那么夜间模式你可以在skin-night工程中设置
night/***/colors.xml
<color name="background">#000000</color>
step4.将新建的module打包apk
在AndroidStudio右侧gradle展开后选取night->Tasks->build->assembleRelease
将打包生成的apk文件, 重命名为’xxx.skin’, 防止apk结尾的文件造成混淆.
step5.加载皮肤插件
加载插件式皮肤, 将皮肤包放到assets/skins目录下
CommonsLibrary/build.gradle(或主Module)中加入
//皮肤 夜间模式
api 'skin.support:skin-support:3.1.1' // skin-support 基础控件支持
api 'skin.support:skin-support-design:3.1.1' // skin-support-design material design 控件支持[可选]
api 'skin.support:skin-support-cardview:3.1.1' // skin-support-cardview CardView 控件支持[可选]
api 'skin.support:skin-support-constraint-layout:3.1.1' // skin-support-constraint-layout ConstraintLayout 控件支持[可选]
Application初始化中加入皮肤插件初始化
SkinCompatManager.withoutActivity(this) // 基础控件换肤初始化
.addInflater(new SkinMaterialViewInflater()) // material design 控件换肤初始化[可选]
.addInflater(new SkinConstraintViewInflater()) // ConstraintLayout 控件换肤初始化[可选]
.addInflater(new SkinCardViewInflater()) // CardView v7 控件换肤初始化[可选]
.setSkinStatusBarColorEnable(false) // 关闭状态栏换肤,默认打开[可选]
.setSkinWindowBackgroundEnable(false) // 关闭windowBackground换肤,默认打开[可选]
.loadSkin();
并提供夜间模式的切换方法
public void changeSkin(boolean isNight) {
if (isNight) {
// 指定皮肤插件
SkinCompatManager.getInstance().loadSkin("night.skin", SkinCompatManager.SKIN_LOADER_STRATEGY_ASSETS);
} else {
// 恢复应用默认皮肤
SkinCompatManager.getInstance().restoreDefaultTheme();
}
}