坑一:自己创建新的demo项目,测试基础控件换肤功能,发现无论如何都换肤不成功,皮肤使用下载的night.skin
按照githut上面的步骤执行添加之后你会发现,仍然无法实现换肤,在监听里面一直提示资源获取失败。
先说说github上面的步骤(实现最简单的换肤功能)
1:导入依赖: compile 'skin.support:skin-support:2.2.3' ,这是导入基础控件的换肤
2:导入皮肤包,我最开始是用放在应用里面的方法,即将皮肤包放在app/assets/skins下面,一定要放在skins下面
3:自定义Application,在onCreate中初始化换肤的管理类(SkinCompatManager)
4:将要换肤的activity继承SkinCompatActivity,在要换肤的地方调用换肤方法,
SkinCompatManager.getInstance().loadSkin("night.skin");
入参可以自己查看,可以实现监听等
这些是githut上面说明的方法,但是但是不行,我在这儿坑了好久,最后发现需要添加权限,就没想到还要添加读写外部存储权限。坑二:当上面成功之后,你觉得自己已经实现换肤功能了,但是当自己制作皮肤包时又被坑了一把。
还是github上面已给出的方法。
1:新建Android Application,皮肤工程包名不能和宿主包名相同,就这一步一直有疑问,开始不知道具体创建哪个module;
1.1(补充):module必须与app在同一个Application/Library name:下否则打包时找不到module
2:修改对应资源
3:打包生成APK,这步是最坑的,刚开始以为直接将对应module Run就OK的,然后会出现没有默认activity问题,这个百度了下就解决了,然后就这样生成了apk了,改名放入assets中发现无效,同样找了好久问题。
对应新建哪个module的问题,需要新建Phone & Table Module 这个,选择无activity
对于打包问题,需要用到studio下面的Terminal命令行来编译: ./gradlew :skin3:assembleDebug skin3就是对应皮肤包名。
打包完的apk路径:/work/demos/soarosLauncher/skin/Skins/skin3/build/outputs/apk/debug。坑三:如果想将皮肤包放到sdCard中,不能指定存放位置,固定需要写入:/Android/data/你的应用包名/cache/skins/
我发现放在assets下面的皮肤包也会被放置到上面的路径下面,然后在执行换肤,所以第一条里面的读写权限
以上原文出处链接:https://www.jianshu.com/p/366dc3bee6c8
在下个人补充一点坑1.应用内换肤找不到res-night
要把res-night文件夹的信息添加到app的gradle中
sourceSets {
main {
res.srcDirs = ['src/main/res','src/main/res-night']
}
}
写在android{}之内2.应用内换肤时所有的资源文件都要加上后缀 _night
包括 xml文件 layout文件 drawable文件 图片资源