溫馨提示×

溫馨提示×

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

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

Android實現(xiàn)apk插件方式換膚的實例

發(fā)布時間:2021-04-16 09:51:37 來源:億速云 閱讀:144 作者:小新 欄目:移動開發(fā)

這篇文章給大家分享的是有關(guān)Android實現(xiàn)apk插件方式換膚的實例的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

1.什么時候換膚?

xml加載前換膚,如果xml加載后換膚,用戶將會看見換膚之前的色彩,用戶體驗不好。

2.皮膚是什么?

皮膚就是apk,是一個資源包,包含了顏色、圖片等。

3.什么樣的控件應(yīng)該進(jìn)行換膚?

包含背景圖片的控件,例如textView文字顏色。

4.皮膚與已安裝的資源如何匹配?

資源名字匹配

步驟:

1.xml加載前換膚,意味著需要將所需要換膚的控件收集起來。因此要監(jiān)聽xml加載的過程。

public class BaseActivity extends Activity {

 SkinFactory skinFactory;

 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState){
  super.onCreate(savedInstanceState);

  //監(jiān)聽xml生成的過程
  skinFactory = new SkinFactory();
  LayoutInflaterCompat.setFactory(getLayoutInflater(),skinFactory);
 }
}

2.需要換膚的控件收集到一個容器中并且不更改自己的邏輯直接換膚(例如:不用在每個需要換膚的空間里面加上: “ app:...... ”  自定義控件屬性)

思考:

(1)安裝的apk的id與皮膚id是否一樣?

(2)圖片的資源、顏色資源都對應(yīng)R自動生成的id

(3)皮膚包的資源id、R文件的資源id以及app里R文件的資源的id是否是一樣的?——是不一樣的

3.一個activity有多個控件(SkinView) 一個控件對應(yīng)多個換膚屬性(SkinItem)

Android實現(xiàn)apk插件方式換膚的實例

SkinItem來封裝這些值:

attrName-屬性名(background)attrValue-屬性值id 十六進(jìn)制(@color/colorPrimaryDark)attrType--類型(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加載過程中換膚)

 Android實現(xiàn)apk插件方式換膚的實例

創(chuàng)建SkinManager去獲得皮膚apk,app通過SkinManager獲取皮膚apk

(1)加載皮膚包(loadSkin):通過反射獲得AsserManager的addAssetpath()方法,再通過這個方法獲得皮膚apk,從而實例化skinResource;再通過PackageManager.getPackageArchiveInfo(path,PackageManager.GET_ACTIVITIES).packageName;獲得皮膚包名

(2)獲取顏色(getColor):判斷skinResource是否為空;拿到res的名字,eg:通過“colorAccent”去尋找id

Android實現(xiàn)apk插件方式換膚

感謝各位的閱讀!關(guān)于“Android實現(xiàn)apk插件方式換膚的實例”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI