工程设计

工程说明

本框架是基于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 条评论

发表回复

您的电子邮箱地址不会被公开。