91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

惠来县| 桂东县| 綦江县| 清远市| 山西省| 通辽市| 鸡泽县| 务川| 陵川县| 莫力| 灌云县| 左权县| 丁青县| 延津县| 十堰市| 台州市| 凭祥市| 柏乡县| 宝丰县| 临澧县| 大庆市| 广南县| 岑巩县| 永川市| 永福县| 进贤县| 罗城| 江孜县| 中方县| 九江市| 承德县| 彰化县| 蓝山县| 阿巴嘎旗| 富蕴县| 牟定县| 凤城市| 水城县| 铁岭县| 祁东县| 祁连县|