公司產(chǎn)品有一個(gè)換膚需求,剛好年后才正真開始,所以利用年前這幾天調(diào)研下?lián)Q膚功能,網(wǎng)上百度了下發(fā)現(xiàn)還有不少的第三方框架可以直接使用,所以就果斷決定選擇其中一個(gè)框架來使用。調(diào)研了一天,其中發(fā)現(xiàn)Android-skin-support這個(gè)框架不錯(cuò),github上面寫的很詳細(xì),而且擴(kuò)展性也很好,關(guān)鍵的關(guān)鍵還有純中文文檔,一切覺得是那么簡單,可是搞了兩天才把換膚最最基礎(chǔ)的搞好。下面就說說自己遇到的坑吧!只是對(duì)于我自己可能是個(gè)坑,其他人不一定的,反正留著自己看吧!
具體的操作流程可以:https://github.com/ximsfei/Android-skin-support,上面有很詳細(xì)的流程,我也是按照來的,只是這里記錄在實(shí)際應(yīng)用遇到的githut上面沒有的細(xì)節(jié)。
坑一:自己創(chuàng)建新的demo項(xiàng)目,測試基礎(chǔ)控件換膚功能,發(fā)現(xiàn)無論如何都換膚不成功,皮膚使用下載的night.skin
按照githut上面的步驟執(zhí)行添加之后你會(huì)發(fā)現(xiàn),仍然無法實(shí)現(xiàn)換膚,在監(jiān)聽里面一直提示資源獲取失敗。
????????????????? 先說說github上面的步驟(實(shí)現(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)⒖梢宰约翰榭?,可以?shí)現(xiàn)監(jiān)聽等
這些是githut上面說明的方法,但是但是不行,我在這兒坑了好久,最后發(fā)現(xiàn)需要添加權(quán)限,就沒想到還要添加讀寫外部存儲(chǔ)權(quán)限。
?? 坑二:當(dāng)上面成功之后,你覺得自己已經(jīng)實(shí)現(xiàn)換膚功能了,但是當(dāng)自己制作皮膚包時(shí)又被坑了一把。
? ? ? ? 還是github上面已給出的方法。
? ? ? ? 1:新建Android Application,皮膚工程包名不能和宿主包名相同,就這一步一直有疑問,開始不知道具體創(chuàng)建哪個(gè)module;
? ? ? ? 2:修改對(duì)應(yīng)資源
3:打包生成APK,這步是最坑的,剛開始以為直接將對(duì)應(yīng)module Run就OK的,然后會(huì)出現(xiàn)沒有默認(rèn)activity問題,這個(gè)百度了下就解決了,然后就這樣生成了apk了,改名放入assets中發(fā)現(xiàn)無效,同樣找了好久問題。
對(duì)應(yīng)新建哪個(gè)module的問題,需要新建Phone & Table Module 這個(gè),選擇無activity
對(duì)于打包問題,需要用到studio下面的Terminal命令行來編譯: ./gradlew :skin3:assembleDebug? skin3就是對(duì)應(yīng)皮膚包名。
打包完的apk路徑:/work/demos/soarosLauncher/skin/Skins/skin3/build/outputs/apk/debug。
?? 坑三:如果想將皮膚包放到sdCard中,不能指定存放位置,固定需要寫入:/Android/data/你的應(yīng)用包名/cache/skins/
??????? 我發(fā)現(xiàn)放在assets下面的皮膚包也會(huì)被放置到上面的路徑下面,然后在執(zhí)行換膚,所以第一條里面的讀寫權(quán)限