AndroidAPP怎么換膚-創(chuàng)新互聯(lián)

這篇文章主要講解了“Android APP怎么換膚”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Android APP怎么換膚”吧!

成都創(chuàng)新互聯(lián)一直通過網(wǎng)站建設(shè)和網(wǎng)站營銷幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實(shí)效"的一站式服務(wù),以網(wǎng)站制作、成都網(wǎng)站制作、移動(dòng)互聯(lián)產(chǎn)品、營銷型網(wǎng)站服務(wù)為核心業(yè)務(wù)。10多年網(wǎng)站制作的經(jīng)驗(yàn),使用新網(wǎng)站建設(shè)技術(shù),全新開發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價(jià)格便宜而且實(shí)用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡單易用,維護(hù)方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。

背景需求

目前Android APP換膚大體可分為兩大類:

  • 兩套主題的切換(比如白天/黑夜),使用一個(gè)開關(guān)按鈕進(jìn)行切換。

  • 多套主題在線下載并更新。

第一種的實(shí)現(xiàn)基本上使用設(shè)置本地Theme來操作,即將所有的資源打包到APP中,并且根據(jù)主題進(jìn)行切換。 第二種不可能使用第一種的實(shí)現(xiàn)方式,因?yàn)閷⑺匈Y源都打包到APP中缺乏靈活性,不利于活動(dòng)的更新,并且也會(huì)使得apk包的體積變大。所有第二種的實(shí)現(xiàn)必須是支持線上下載的。

方案選擇

配合產(chǎn)品的需求并且能實(shí)現(xiàn)換膚的靈動(dòng)性,我們選擇上述的第二種方案。經(jīng)過之前的AndroidIOS成員小組討論,統(tǒng)一覺得可以采用下載壓縮包,并通過解析壓縮包讀取資源進(jìn)行替換。

壓縮包下載下來后怎么讀取資源?這里有兩種方式:

  • 將下載的皮膚包進(jìn)行解壓縮并且通過文件流的方式讀取里面的圖片資源、文件資源。

  • 將下載的皮膚包加載到assetManager管理器中,并通過該管理器新建一個(gè)Resource對象,需要換膚的控件通過Resource對象進(jìn)行讀取資源。

第一種方式需要手動(dòng)開啟文件流,并且不同的文件流有不同的文件流方式,比如圖片、文本文件等,還有不同設(shè)備由于分辨率加載的資源是不同的,如何合理地去選擇合適的資源去加載也是一個(gè)需要解決的問題。

第二種方式需要將皮膚包加載到assetManager管理器,assetManager管理器新生成的Resource對象和我們主工程的Resource對象是相同類的不同對象,可以使用我們熟悉的方式去加載資源(如resource.getColor,resource.getDrawable等)。

基于上述兩種加載資源的方式,這里選擇第二種方式進(jìn)行資源的加載與讀取。

具體實(shí)施

1、將所需的皮膚包通過網(wǎng)絡(luò)下載到本地,這里的皮膚包是一個(gè)apk文件,為了讓apk包足夠小,里面只包含資源文件??赡苡卸鄠€(gè)皮膚包,比如theme1.skin,theme2.skin......

2、通過后臺(tái)獲取需要加載的皮膚包的名字,如theme1.skin,通過調(diào)用AssetManager對象的addAssetPath方法并生成一個(gè)新的Resource對象,如下代碼:

  AssetManager assetManager = AssetManager.class.newInstance();  //由于addAssetPath()這個(gè)方法被隱藏掉了,所以不能直接使用對象直接訪問,
  //這里使用了反射的方式,作用是將該皮膚包加入到asset管理器中
  Method addAssetPath = assetManager.getClass().getMethod("addAssetPath"
  , String.class);
  addAssetPath.invoke(assetManager, skinPath);
  Resources skinResource = new Resources(
    assetManager, superRes.getDisplayMetrics(), superRes.getConfiguration());

3、自定義一個(gè)InflaterFactory的子類,SkinInflaterFactory,重寫onCreateView(View, String, Context, AttributeSet)方法,對于需要換膚的控件進(jìn)行屬性的解析與存儲(chǔ),然后對這些換膚的控件去第二步的Resource對象中加載資源并設(shè)置到這些控件中。

4、在BaseActivityonCreate方法新建SkinInflaterFactory對象,并將該SkinInflateFactory對象設(shè)置給ActivityLayoutInflater對象,如下代碼:

  protected void onCreate(@Nullable Bundle savedInstanceState) {
      mSkinInflaterFactory = new SkinInflaterFactory();
      LayoutInflaterCompat.setFactory(
        getLayoutInflater(), mSkinInflaterFactory);      super.onCreate(savedInstanceState);
  }

流程圖

Android APP怎么換膚

其他問題

1、如何支持控件點(diǎn)擊后觸發(fā)不同的業(yè)務(wù)流程?
可以通過自定義一個(gè)屬性,如skin:click="@string/clickAction",主工程的clickAction="muapp://app/testDefault",皮膚包里的clickAction="muapp://app/testClick",通過目前項(xiàng)目中的路由機(jī)制觸發(fā)不同的跳轉(zhuǎn)動(dòng)作。比如說上述默認(rèn)的跳轉(zhuǎn)是跳轉(zhuǎn)到主工程(appmodule名)的TestDefaultAction(注解actionName="testDefault")類的invoke方法中,而更改后會(huì)跳轉(zhuǎn)到主工程(appmodule名)的TestClickAction(注解actionName="testClick")類的invoke方法中。
2、如何支持控件的不同行為方式?例如不同的動(dòng)畫效果等
這個(gè)問題和第一個(gè)問題的處理方式的類似的,同樣可以通過主工程和皮膚包不同的tagString文案)處理不同的行為方式。
3、如何處理自定義View的換膚需求?
可以添加一個(gè)方法,將自定義View需要換膚的屬性名(如background),屬性值(如background對應(yīng)的圖片的資源ID)傳遞到方法中,然后去皮膚包的Resource對象中尋找是否有相應(yīng)的可替換的皮膚或者可替換的行為。

感謝各位的閱讀,以上就是“Android APP怎么換膚”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Android APP怎么換膚這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站欄目:AndroidAPP怎么換膚-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://bm7419.com/article30/dpccpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、做網(wǎng)站定制開發(fā)、動(dòng)態(tài)網(wǎng)站全網(wǎng)營銷推廣、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司