扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章给大家分享的是有关Android实现apk插件方式换肤的实例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
目前成都创新互联公司已为1000+的企业提供了网站建设、域名、网络空间、绵阳服务器托管、企业网站设计、屯留网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
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 Listlist; //收集需要换肤的集合 public SkinView(View view, List 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实现apk插件方式换肤的实例”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流