成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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)站制作、移動互聯(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)站,不但價格便宜而且實(shí)用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡單易用,維護(hù)方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。

背景需求

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

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

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

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

方案選擇

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

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

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

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

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

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

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

具體實(shí)施

1、將所需的皮膚包通過網(wǎng)絡(luò)下載到本地,這里的皮膚包是一個apk文件,為了讓apk包足夠小,里面只包含資源文件。可能有多個皮膚包,比如theme1.skintheme2.skin......

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

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

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

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

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

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

廣告

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

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
广宗县| 东兰县| 崇信县| 全州县| 大同县| 赤壁市| 巴东县| 辉县市| 桐乡市| 永康市| 邢台县| 凉山| 淮阳县| 青神县| 抚州市| 宁明县| 高唐县| 巴彦县| 醴陵市| 彰化县| 葫芦岛市| 个旧市| 安多县| 扎兰屯市| 阜城县| 阜宁县| 江阴市| 茌平县| 北海市| 甘肃省| 巍山| 海宁市| 阿拉善左旗| 郁南县| 巫溪县| 惠水县| 客服| 香格里拉县| 南安市| 奈曼旗| 普洱|