换肤框架 Android-skin-support
- 在Application中初始化
public class BaseApplication extends Application {
@Override public void onCreate() {
super.onCreate();
SkinCompatManager.withoutActivity(this)
.addStrategy(new CustomSDCardLoader()) // 基础控件换肤初始化--自定义加载策略
.addInflater(new SkinMaterialViewInflater()) // material design 控件换肤初始化[可选]
.addInflater(new SkinConstraintViewInflater()) // ConstraintLayout 控件换肤初始化[可选]
.addInflater(new SkinCardViewInflater()) // CardView v7 控件换肤初始化[可选]
.setSkinStatusBarColorEnable(false) // 关闭状态栏换肤,默认打开[可选]
.setSkinWindowBackgroundEnable(false) // 关闭windowBackground换肤,默认打开[可选]
.loadSkin();
//AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
}
- 恢复系统默认皮肤
SkinCompatManager.getInstance().restoreDefaultTheme();
- 应用内换肤
步骤: 添加res-night资源文件夹(切记一定要是资源文件夹, 其中的night可替换为任意单词), 使用如下代码可切换主题。
// 后缀加载策略, 在相对应的资源名称后添加_night
SkinCompatManager.getInstance().loadSkin("night", null, SkinCompatManager.SKIN_LOADER_STRATEGY_BUILD_IN);
- 插件式换肤
步骤: 新建一个没有Activity的module, 此module中只包含资源文件, 其命名与原资源文件名相同, 运行后将编译出的.apk文件后缀名更改为.skin,为了防止点击安装, 将night.skin文件复制到assets/skins/路径下,使用如下代码进行过换肤。
// 此处找的路径为assets/skins/night.skin
SkinCompatManager.getInstance().loadSkin("night.skin", null, SkinCompatManager.SKIN_LOADER_STRATEGY_ASSETS);
- 自定义加载策略换肤
步骤: 新建一个没有Activity的module, 此module中只包含资源文件, 其命名与原资源文件名相同, 运行后将编译出的.apk文件后缀名更改为.skin,为了防止点击安装, 将night.skin文件复制到/data/data/应用包名/cache/skins/路径下,使用如下代码进行过换肤。
// 该文件在路径/data/data/应用包名/cache/skins/night.skin中, 自定义的加载策略必须在Application中配置
SkinCompatManager.getInstance().loadSkin("night.skin", null, CustomSDCardLoader.SKIN_LOADER_STRATEGY_SDCARD);
/**
* 自定义加载策略, 必须在Application中配置
* SkinCompatManager.withoutActivity(this)
.addStrategy(new CustomSDCardLoader()) // 基础控件换肤初始化
.addInflater(new SkinMaterialViewInflater()) // material design 控件换肤初始化[可选]
.addInflater(new SkinConstraintViewInflater()) // ConstraintLayout 控件换肤初始化[可选]
.addInflater(new SkinCardViewInflater()) // CardView v7 控件换肤初始化[可选]
.setSkinStatusBarColorEnable(false) // 关闭状态栏换肤,默认打开[可选]
.setSkinWindowBackgroundEnable(false) // 关闭windowBackground换肤,默认打开[可选]
.loadSkin();
*/
public class CustomSDCardLoader extends SkinSDCardLoader{
public static final int SKIN_LOADER_STRATEGY_SDCARD = Integer.MAX_VALUE;
@Override
protected String getSkinPath(Context context, String skinName) {
return new File(SkinFileUtils.getSkinDir(context), skinName).getAbsolutePath();
}
@Override
public int getType() {
return SKIN_LOADER_STRATEGY_SDCARD;
}
}