目录
工程设计
工程说明
本框架是基于Github上start最多的换肤框架https://github.com/ximsfei/Android-skin-support
优化而来,优化如下:
1)支持DataBinding,我只提供获取皮肤资源的接口,你想用在哪里就用在哪里。
2)保留使用者createView的接口,但是不去复写系统所有的控件,觉得这种办法很不优雅。
3)优化了一下皮肤资源加载的逻辑,觉得原来的框架这部分有些混乱。
工程设计的思路
调研了网上start比较多的开源换肤框架,发现换肤的原理很简单。换肤通俗点说就是收集需要换肤的View+资源加载+换肤。
- 收集换肤的View
网络上基本就两种做法:
第一种,通过Factory2,在onCreateView的时候收集View。
第二种,通过遍历contentView收集View。这种是张鸿洋提出来的,但是这种方法无法自己createView,无法动态替换xml中的View。
本框架采用的就是第一种方案Factory2
-
资源加载
分应用内资源加载和插件式资源加载
1)应用内资源加载
本框架会内置两种模式:前缀式和后缀式命名的皮肤资源
2)插件式资源加载
只有res的apk,通过获取apk的Resources实例在实现换肤。
-
换肤
1)属性替换
在Activity创建的时候会进行属性替换,如果在换肤方法执行后,当前Activity会执行换肤,非当前Activity的onResume方法会执行换肤。
2)SkinCompatSupportable接口执行
如果Application、Activity、View实现了SkinCompatSupportable接口,在换肤时会自动执行此接口。
换肤框架图
Android-skin-support的注意项
1.为什么要复写AppcompatActivity的getDelegate()方法
因为框架是通过installLayoutFactory来设置代理的Factory2的,框架通过application.registerActivityLifecycleCallbacks注册Activity的生命周期,然后在onActivityCreated方法里installLayoutFactory,但是onActivityCreated比Activity的onCreate方法后执行,所以要复写AppcompatActivity的getDelegate()方法防止activity默认的installLayoutFactory方法提前执行,因为setFactory2只能执行一次。
2.关于SkinAppCompatDelegateImpl类
这个类是继承系统的AppCompatDelegateImpl类,这个类是hide并且是protected的,所以SkinAppCompatDelegateImpl所在包名必须与AppCompatDelegateImpl类的包名一致,否则会报编译错误。
而且这个类所在module的gradle类里,要配置:
lintOptions {
abortOnError false
}
否则也会编译不通过。
0 条评论