服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android实现apk插件方式换肤的实例讲解

Android实现apk插件方式换肤的实例讲解

2022-11-03 15:02似鱼 Android

在本篇文章里小编给大家整理的是关于Android实现apk插件方式换肤的实例代码以及相关知识点,有需要的朋友们学习下。

1.什么时候换肤?

xml加载前换肤,如果xml加载后换肤,用户将会看见换肤之前的色彩,用户体验不好。

2.皮肤是什么?

皮肤就是apk,是一个资源包,包含了颜色、图片等。

3.什么样的控件应该进行换肤?

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

4.皮肤与已安装的资源如何匹配?

资源名字匹配

步骤:

1.xml加载前换肤,意味着需要将所需要换肤的控件收集起来。因此要监听xml加载的过程。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class BaseActivity extends Activity {
 
 SkinFactory skinFactory;
 
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
 
  //监听xml生成的过程
  skinFactory = new SkinFactory();
  LayoutInflaterCompat.setFactory(getLayoutInflater(),skinFactory);
 }
}

 

2.需要换肤的控件收集到一个容器中并且不更改自己的逻辑直接换肤(例如:不用在每个需要换肤的空间里面加上: “ app:...... ”  自定义控件属性)

思考:

(1)安装的apk的id与皮肤id是否一样?

(2)图片的资源、颜色资源都对应R自动生成的id

(3)皮肤包的资源id、R文件的资源id以及app里R文件的资源的id是否是一样的?——是不一样的

3.一个activity有多个控件(SkinView) 一个控件对应多个换肤属性(SkinItem)

Android实现apk插件方式换肤的实例讲解

SkinItem来封装这些值:

attrName-属性名(background)attrValue-属性值id 十六进制(@color/colorPrimaryDark)attrType--类型(color)Id(R文件的id)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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:

?
1
2
3
4
5
6
7
8
9
class SkinView{
  private View view;
  private List<SkinItem> list; //收集需要换肤的集合
 
  public SkinView(View view, List<SkinItem> list) {
   this.view = view;
   this.list = list;
  }
 }

 

4.收集完毕后,应用换肤 (xml加载过程中换肤)

 Android实现apk插件方式换肤的实例讲解

 

创建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实现apk插件方式换肤

以上就是本次介绍的全部知识点内容,感谢大家的学习和对服务器之家的支持。

原文链接:https://www.cnblogs.com/jiani/p/11644608.html

延伸 · 阅读

精彩推荐