注:下文源码有删减,截图只体现主流程
1、换肤原理
换肤就是替换资源(文字、颜色、图片等),而换肤基本有两种模式:一是内置换肤(在Apk包中存在多种资源(图片、颜色值)用于换肤时候切换。自由度低,apk文件大,一般用于没有其他需求的日间/夜间模式app);二是动态换肤(通过运行时动态加载皮肤包)。Android页面加载是因为setContentView(),所以第一步看看setContentView源码到底是怎么实现设置一个布局ID就能显示页面的(注:这里分析AppCompatActivity的setContentView方法,Activity的setContentView方法会不同)。
2、AppCompatActivity.java
13、AppCompatDelegateImplV9.java
2注:使用LayoutInflater布局加载器将布局文件加载到contentParent中
4、LayoutInflater.java
3注:获取到一个Resources对象,获取到xml解析器XmlResourceParser,解析布局文件
4注释1:通过解析器获取一个节点名,比如我们布局文件的的一个TextView节点。
注释2:获取到根View
注释3:解析所有子view
5注释1:通过mFactory2创建view;
注释2:创建系统自带的view;
注释3:创建自定义view(自定义view带了点)
6注释1 获取到View的Class对象。
注释2 通过反射获取到View的构造方法。
注释3 通过构造函数创建View。
7注意:setFactory2只能设置一次,否则会报异常。所以我们在自定义Factory2的时候,需要重新设置mFactorySet的值(设置mFactorySet为false)。因为mFactorySet是私有的,可以通过反射,然后修改该参数值。
网友评论