公司产品有一个换肤需求,刚好年后才正真开始,所以利用年前这几天调研下换肤功能,网上百度了下发现还有不少的第三方框架可以直接使用,所以就果断决定选择其中一个框架来使用。调研了一天,其中发现Android-skin-support这个框架不错,github上面写的很详细,而且扩展性也很好,关键的关键还有纯中文文档,一切觉得是那么简单,可是搞了两天才把换肤最最基础的搞好。下面就说说自己遇到的坑吧!只是对于我自己可能是个坑,其他人不一定的,反正留着自己看吧!
具体的操作流程可以:https://github.com/ximsfei/Android-skin-support,上面有很详细的流程,我也是按照来的,只是这里记录在实际应用遇到的githut上面没有的细节。
坑一:自己创建新的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;
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下面的皮肤包也会被放置到上面的路径下面,然后在执行换肤,所以第一条里面的读写权限