温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android如何实现apk插件方式换肤

发布时间:2021-09-27 11:14:36 来源:亿速云 阅读:128 作者:小新 栏目:编程语言

这篇文章主要为大家展示了“Android如何实现apk插件方式换肤”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android如何实现apk插件方式换肤”这篇文章吧。

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插件方式换肤”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI