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插件方式换肤
以上就是本次介绍的全部知识点内容,感谢大家的学习和对脚本之家的支持。
相关文章
Android 使用Vitamio打造自己的万能播放器(3)——本地播放(主界面、播放列表)
本文主要介绍 Android Vitamio本地播放功能,这里提供实例代码和效果图以便大家参考,有需要的小伙伴可以参考下2016-07-07
ListView的View回收引起的checkbox状态改变监听等问题解决方案
之前讲到了自定义Adapter传递给ListView时,因为ListView的View回收,需要注意当ListView列表项中包含有带有状态标识控件的问题,感兴趣的朋友可以祥看本文,或许会有意外的收获哦2013-01-01


最新评论