公司產(chǎn)品有一個換膚需求,剛好年后才正真開始,所以利用年前這幾天調(diào)研下?lián)Q膚功能秀仲,網(wǎng)上百度了下發(fā)現(xiàn)還有不少的第三方框架可以直接使用,所以就果斷決定選擇其中一個框架來使用壶笼。調(diào)研了一天神僵,其中發(fā)現(xiàn)Android-skin-support這個框架不錯,github上面寫的很詳細覆劈,而且擴展性也很好保礼,關(guān)鍵的關(guān)鍵還有純中文文檔,一切覺得是那么簡單,可是搞了兩天才把換膚最最基礎(chǔ)的搞好责语。下面就說說自己遇到的坑吧炮障!只是對于我自己可能是個坑,其他人不一定的坤候,反正留著自己看吧胁赢!
具體的操作流程可以:https://github.com/ximsfei/Android-skin-support,上面有很詳細的流程白筹,我也是按照來的智末,只是這里記錄在實際應(yīng)用遇到的githut上面沒有的細節(jié)。
坑一:自己創(chuàng)建新的demo項目徒河,測試基礎(chǔ)控件換膚功能系馆,發(fā)現(xiàn)無論如何都換膚不成功,皮膚使用下載的night.skin
按照githut上面的步驟執(zhí)行添加之后你會發(fā)現(xiàn)顽照,仍然無法實現(xiàn)換膚它呀,在監(jiān)聽里面一直提示資源獲取失敗。
????????????????? 先說說github上面的步驟(實現(xiàn)最簡單的換膚功能)
1:導(dǎo)入依賴: compile 'skin.support:skin-support:2.2.3' ,這是導(dǎo)入基礎(chǔ)控件的換膚
2:導(dǎo)入皮膚包纵穿,我最開始是用放在應(yīng)用里面的方法下隧,即將皮膚包放在app/assets/skins下面,一定要放在skins下面
3:自定義Application谓媒,在onCreate中初始化換膚的管理類(SkinCompatManager)
4:將要換膚的activity繼承SkinCompatActivity淆院,在要換膚的地方調(diào)用換膚方法,
SkinCompatManager.getInstance().loadSkin("night.skin")句惯;
入?yún)⒖梢宰约翰榭赐帘纾梢詫崿F(xiàn)監(jiān)聽等
這些是githut上面說明的方法,但是但是不行抢野,我在這兒坑了好久拷淘,最后發(fā)現(xiàn)需要添加權(quán)限,就沒想到還要添加讀寫外部存儲權(quán)限指孤。
?? 坑二:當上面成功之后启涯,你覺得自己已經(jīng)實現(xiàn)換膚功能了,但是當自己制作皮膚包時又被坑了一把恃轩。
? ? ? ? 還是github上面已給出的方法结洼。
? ? ? ? 1:新建Android Application,皮膚工程包名不能和宿主包名相同叉跛,就這一步一直有疑問松忍,開始不知道具體創(chuàng)建哪個module;
? ? ? ? 2:修改對應(yīng)資源
3:打包生成APK筷厘,這步是最坑的鸣峭,剛開始以為直接將對應(yīng)module Run就OK的,然后會出現(xiàn)沒有默認activity問題酥艳,這個百度了下就解決了摊溶,然后就這樣生成了apk了,改名放入assets中發(fā)現(xiàn)無效玖雁,同樣找了好久問題更扁。
對應(yīng)新建哪個module的問題,需要新建Phone & Table Module 這個赫冬,選擇無activity
對于打包問題浓镜,需要用到studio下面的Terminal命令行來編譯: ./gradlew :skin3:assembleDebug? skin3就是對應(yīng)皮膚包名。
打包完的apk路徑:/work/demos/soarosLauncher/skin/Skins/skin3/build/outputs/apk/debug劲厌。
?? 坑三:如果想將皮膚包放到sdCard中膛薛,不能指定存放位置,固定需要寫入:/Android/data/你的應(yīng)用包名/cache/skins/
??????? 我發(fā)現(xiàn)放在assets下面的皮膚包也會被放置到上面的路徑下面补鼻,然后在執(zhí)行換膚哄啄,所以第一條里面的讀寫權(quán)限