经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android实现apk插件方式换肤
来源:cnblogs  作者:似鱼  时间:2019/10/15 10:08:46  对本文有异议

换肤思路:

1.什么时候换肤?

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

2.皮肤是什么?

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

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

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

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

资源名字匹配

 

 

步骤:

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

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

 

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)
  1. 1 class SkinItem{
  2. 2 // attrName background
  3. 3 String attrName;
  4. 4
  5. 5 int refId;
  6. 6 // 资源名字 @color/colorPrimaryDark
  7. 7 String attrValue;
  8. 8 // drawable color
  9. 9 String attrType;
  10. 10
  11. 11 public SkinItem(String attrName, int refId, String attrValue, String attrType) {
  12. 12 this.attrName = attrName;
  13. 13 this.refId = refId;
  14. 14 this.attrValue = attrValue;
  15. 15 this.attrType = attrType;
  16. 16 }
  17. 17
  18. 18 public String getAttrName() {
  19. 19 return attrName;
  20. 20 }
  21. 21
  22. 22 public int getRefId() {
  23. 23 return refId;
  24. 24 }
  25. 25
  26. 26 public String getAttrValue() {
  27. 27 return attrValue;
  28. 28 }
  29. 29
  30. 30 public String getAttrType() {
  31. 31 return attrType;
  32. 32 }
  33. 33 }

SkinView:

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

 

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号