中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android APP怎么換膚

發布時間:2021-12-02 14:17:00 來源:億速云 閱讀:141 作者:iii 欄目:移動開發

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

背景需求

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

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

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

第一種的實現基本上使用設置本地Theme來操作,即將所有的資源打包到APP中,并且根據主題進行切換。 第二種不可能使用第一種的實現方式,因為將所有資源都打包到APP中缺乏靈活性,不利于活動的更新,并且也會使得apk包的體積變大。所有第二種的實現必須是支持線上下載的。

方案選擇

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

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

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

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

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

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

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

具體實施

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

2、通過后臺獲取需要加載的皮膚包的名字,如theme1.skin,通過調用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)方法,對于需要換膚的控件進行屬性的解析與存儲,然后對這些換膚的控件去第二步的Resource對象中加載資源并設置到這些控件中。

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

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

流程圖

Android APP怎么換膚

其他問題

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

感謝各位的閱讀,以上就是“Android APP怎么換膚”的內容了,經過本文的學習后,相信大家對Android APP怎么換膚這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安化县| 麟游县| 浑源县| 沈丘县| 手机| 江油市| 太谷县| 安义县| 宜州市| 郧西县| 简阳市| 北海市| 威远县| 扬州市| 花莲县| 万盛区| 休宁县| 阿合奇县| 邵阳县| 滦南县| 郑州市| 涿州市| 铜鼓县| 永德县| 河西区| 章丘市| 登封市| 千阳县| 广河县| 牙克石市| 青岛市| 灌南县| 株洲市| 博白县| 玉林市| 峨眉山市| 西贡区| 凤庆县| 邵阳县| 如东县| 青铜峡市|