Android實(shí)現(xiàn)apk插件方式換膚的實(shí)例講解
1.什么時(shí)候換膚?
xml加載前換膚,如果xml加載后換膚,用戶(hù)將會(huì)看見(jiàn)換膚之前的色彩,用戶(hù)體驗(yàn)不好。
2.皮膚是什么?
皮膚就是apk,是一個(gè)資源包,包含了顏色、圖片等。
3.什么樣的控件應(yīng)該進(jìn)行換膚?
包含背景圖片的控件,例如textView文字顏色。
4.皮膚與已安裝的資源如何匹配?
資源名字匹配
步驟:
1.xml加載前換膚,意味著需要將所需要換膚的控件收集起來(lái)。因此要監(jiān)聽(tīng)xml加載的過(guò)程。
public class BaseActivity extends Activity { SkinFactory skinFactory; @Override protected void onCreate(@Nullable Bundle savedInstanceState){ super.onCreate(savedInstanceState); //監(jiān)聽(tīng)xml生成的過(guò)程 skinFactory = new SkinFactory(); LayoutInflaterCompat.setFactory(getLayoutInflater(),skinFactory); } }
2.需要換膚的控件收集到一個(gè)容器中并且不更改自己的邏輯直接換膚(例如:不用在每個(gè)需要換膚的空間里面加上: “ app:...... ” 自定義控件屬性)
思考:
(1)安裝的apk的id與皮膚id是否一樣?
(2)圖片的資源、顏色資源都對(duì)應(yīng)R自動(dòng)生成的id
(3)皮膚包的資源id、R文件的資源id以及app里R文件的資源的id是否是一樣的?——是不一樣的
3.一個(gè)activity有多個(gè)控件(SkinView) 一個(gè)控件對(duì)應(yīng)多個(gè)換膚屬性(SkinItem)
SkinItem來(lái)封裝這些值:
attrName-屬性名(background)attrValue-屬性值id 十六進(jìn)制(@color/colorPrimaryDark)attrType--類(lèi)型(color)Id(R文件的id)
class SkinItem{ // attrName background String attrName; int refId; // 資源名字 @color/colorPrimaryDark String attrValue; // drawable color String attrType; public SkinItem(String attrName, int refId, String attrValue, String attrType) { this.attrName = attrName; this.refId = refId; this.attrValue = attrValue; this.attrType = attrType; } public String getAttrName() { return attrName; } public int getRefId() { return refId; } public String getAttrValue() { return attrValue; } public String getAttrType() { return attrType; } }
SkinView:
class SkinView{ private View view; private List<SkinItem> list; //收集需要換膚的集合 public SkinView(View view, List<SkinItem> list) { this.view = view; this.list = list; } }
4.收集完畢后,應(yīng)用換膚 (xml加載過(guò)程中換膚)
創(chuàng)建SkinManager去獲得皮膚apk,app通過(guò)SkinManager獲取皮膚apk
(1)加載皮膚包(loadSkin):通過(guò)反射獲得AsserManager的addAssetpath()方法,再通過(guò)這個(gè)方法獲得皮膚apk,從而實(shí)例化skinResource;再通過(guò)PackageManager.getPackageArchiveInfo(path,PackageManager.GET_ACTIVITIES).packageName;獲得皮膚包名
(2)獲取顏色(getColor):判斷skinResource是否為空;拿到res的名字,eg:通過(guò)“colorAccent”去尋找id
Android實(shí)現(xiàn)apk插件方式換膚
以上就是本次介紹的全部知識(shí)點(diǎn)內(nèi)容,感謝大家的學(xué)習(xí)和對(duì)我們的支持。
上一篇:詳解Android使用CoordinatorLayout+AppBarLayout實(shí)現(xiàn)拉伸頂部圖片功能
欄 目:Android
下一篇:RecyclerView+PagerSnapHelper實(shí)現(xiàn)抖音首頁(yè)翻頁(yè)的Viewpager效果
本文標(biāo)題:Android實(shí)現(xiàn)apk插件方式換膚的實(shí)例講解
本文地址:http://mengdiqiu.com.cn/a1/Android/9143.html
您可能感興趣的文章
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方法詳解
- 01-10android實(shí)現(xiàn)記住用戶(hù)名和密碼以及自動(dòng)登錄
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代碼
- 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
- 01-10如何給Flutter界面切換實(shí)現(xiàn)點(diǎn)特效
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10Emoji表情在Android JNI中的兼容性問(wèn)題詳解
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10android實(shí)現(xiàn)記住用戶(hù)名和密碼以及自動(dòng)
- 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10如何給Flutter界面切換實(shí)現(xiàn)點(diǎn)特效
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
- 01-10Emoji表情在Android JNI中的兼容性問(wèn)題詳
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置