目前主流的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();
}
}