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

 更新时间:2019年10月14日 14:15:48   作者:似鱼  
在本篇文章里小编给大家整理的是关于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插件方式换肤

以上就是本次介绍的全部知识点内容,感谢大家的学习和对脚本之家的支持。

相关文章

  • Crashlytics Android 异常报告统计管理(详解)

    Crashlytics Android 异常报告统计管理(详解)

    下面小编就为大家带来一篇Crashlytics Android 异常报告统计管理(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Android实现View滑动的几种方式

    Android实现View滑动的几种方式

    Android中的View类是所有UI控件的基类(Base class),也就是说我们平时所有到的各种UI控件,比如Button、ImagView等等都继承自View类。这篇文章主要为大家详细介绍了Android实现View滑动的几种方式,需要的朋友可以参考下
    2016-04-04
  • Android利用Camera实现中轴3D卡牌翻转效果

    Android利用Camera实现中轴3D卡牌翻转效果

    这篇文章主要介绍了Android利用Camera实现中轴3D卡牌翻转效果,需要的朋友可以参考下
    2015-12-12
  • Android开发使用Messenger及Handler进行通信的方法示例

    Android开发使用Messenger及Handler进行通信的方法示例

    这篇文章主要介绍了Android开发使用Messenger及Handler进行通信的方法,结合实例形式分析了Android使用Messenger及Handler定义客户端与服务器端实现通信的相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • Android判断登录情况

    Android判断登录情况

    这篇文章主要介绍了Android判断登录情况,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Kotlin线程的桥接与切换使用介绍

    Kotlin线程的桥接与切换使用介绍

    这篇文章主要介绍了Android开发中Kotlin线程的桥接与切换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Android 3.0引入的异步加载机制Loader

    Android 3.0引入的异步加载机制Loader

    Loader装载器从android3.0开始引进。它使得在activity或fragment中异步加载数据变得简单。下面我们就来详细讲解下
    2017-12-12
  • Kotlin Flow常用封装类StateFlow使用详解

    Kotlin Flow常用封装类StateFlow使用详解

    这篇文章主要为大家介绍了Kotlin Flow常用封装类StateFlow使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • android嵌套滚动入门实践

    android嵌套滚动入门实践

    嵌套滚动是 Android OS 5.0之后,google 为我们提供的新特性,本篇文章主要介绍了android嵌套滚动入门实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Android自定义View实现垂直时间轴布局

    Android自定义View实现垂直时间轴布局

    这篇文章主要为大家详细介绍了Android自定义View实现垂直时间轴布局的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03

最新评论