欢迎来到代码驿站!

Android代码

当前位置:首页 > 移动开发 > Android代码

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

时间:2021-01-07 11:31:41|栏目:Android代码|点击:

1.什么时候换肤?

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

2.皮肤是什么?

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

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

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

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

资源名字匹配

步骤:

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

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)

SkinItem来封装这些值:

attrName-属性名(background)attrValue-属性值id 十六进制(@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.收集完毕后,应用换肤 (xml加载过程中换肤)

 

 

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

上一篇:Android中NavigationView的使用与相关问题解决

栏    目:Android代码

下一篇:Android标题栏上添加多个Menu按钮的实例

本文标题:Android实现apk插件方式换肤的实例讲解

本文地址:http://www.codeinn.net/misctech/41951.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有