1.通過(guò)設(shè)置不同的style ##
這種方式是通過(guò)設(shè)置theme 然后activity reCreate重新調(diào)用activity 設(shè)置主題必須在oncreate()方法 并且在setContentveiw()方法之前 才有效
這篇文章就是利用這種方式切換主題
缺點(diǎn)是:需要重啟activity
最終方案按照這個(gè)實(shí)現(xiàn)的android-skin-load 動(dòng)態(tài)加載skin包
//https://github.com/burgessjp/ThemeSkinning/? 在android-skin-load的基礎(chǔ)上封裝的
2.Android-Skin-Loader
http://mp.weixin.qq.com/s/MSLsoMGHyxiZ0q7fxR3zvg
加載皮膚包
其內(nèi)部通過(guò)反射調(diào)用AssetManager.addAssetPath()把外部的皮膚資源加載到AssetManager中影斑,并通過(guò)該AssetManager創(chuàng)建相應(yīng)的Resource裕便。當(dāng)執(zhí)行換膚操作的時(shí)候,就可以設(shè)置需要換膚View的相關(guān)屬性為Resource中相應(yīng)的資源
代碼中的細(xì)節(jié)
1.每個(gè)skinAttr記錄的是某個(gè)需要換膚的view的 id background 以及對(duì)應(yīng)的 color / colortitlebar_bg skinAttr -----某個(gè)換膚view 的單個(gè)屬性的一系列字段
2.然后將每個(gè)skinAttr 添加到 ListviewAttrs-----添加某個(gè)view換膚時(shí)所要更改的屬性(可以是多個(gè)屬性)
3.SkinItem (View view; Listattrs; ) 用于封裝單個(gè)view和其需要換膚的對(duì)應(yīng)的屬性集合
4.ListmSkinItems 將所有skinitem進(jìn)行存儲(chǔ) 換膚時(shí)遍歷刷新
關(guān)鍵的兩個(gè)判斷
boolean isSkinEnable = attrs.getAttributeBooleanValue(SkinConfig.NAMESPACE, SkinConfig .ATTRSKINENABLE, false); 先做 skin:enable="true" view里是否有這個(gè)屬性的判斷
if (!AttrFactory.isSupportedAttr(attrName)) 這個(gè)判斷是看自己是否支持這個(gè)屬性 里面一般不全 需要自己添加
更換皮膚
主要根據(jù)ListmSkinItems 遍歷刷新 每個(gè)skinitem 用自己的id從skinmanager獲取資源中的color background
skinmanager //里面的資源的獲取需要自己實(shí)現(xiàn)
public int getColor(int resId)
getDrawable(int resId)
源碼分析 setcontentview(R.layout.xx)的過(guò)程