View加载原理

我们经常在Activity的onCreate()中使用setContentView(R.layout.XX)来加载静态布局,今天我们一起来分析一下界面加载原理。所有技术都是这样,知道原理以后就能做一些意想不到的事情,当然View的加载也是一样。

废话少说直接开干,我们从调用处一层一层贴出了代码,在调用setContentView的时候实际上是调用的LayoutInflater的inflate方法

inflate中先对布局xml进行了解析,解析以后将结果传到重载的另一个inflate方法。

接下来我们点击进入另一个inflate方法,里面首先会判断布局是否是merge include什么的,这些我们先不管,只先分析最简单的情况。如下图,系统通过调用了一个createViewFromTag方法来获取到一个view,那么核心就是这个createViewFromTag方法了,所以我们必须继续往下面看。

进入createViewFromTag方法,发现这里很多判断,但是不管怎么判断,最后都是调用的onCreateView方法,这个onCreateView方法最后点进去是通过反射来获取,具体我这里就不进去看了,大概就是先将布局属性传入到反射constructor中,然后最后通过反射调用JNI底层代码生成的,生成以后再直接从constructor中获取。

View加载拦截

我们再回过头来分析一下最后onCreateView方法是怎么被调用的。如上图,首先判断mFactory2是否为空,如果为空接下来再判断mFactory是否为空,如果也为空的话接下来再判断mPrivateFactory是否为空,如果也为空的话接下来这里就直接调用反射代码获取view了。也就是说如果我们提前设置好自己自定义的Factory的话,就不会调用系统自带的创建view的方式,而是使用我们自定义的了。例如AppCompatActivity为了对控件做一些兼容性,就通过setFactory的方式来自定义了一个factory,对很多控件重新初始化了一次。

借鉴AppCompatActivity的思路,我们也来弄一个自己的Factory,把项目中所有的TextView内容都换成helloworld吧,代码很简单,如下:

最后,再将这个自定义的factory使用起来:

注意这里的顺序,setFactory2方法的调用一定要在super.onCreate之前,否则等系统设置了以后再设置是会报错的。最后看一下效果,界面上所有TextView内容都被替换成helloworld了。运行的效果如下:

是不是很厉害,一键把界面上所有的TextView内容全部给换掉了,其实除了更换文本内容还有很多其他的用法,基本是可以设置的属性都可以更换。主流的用法比如网易云音乐的换肤方案,核心是结合插件化技术实现在不闪烁的情况下更换app皮肤,将在下一篇文章中详细讲解。

View的加载原理和拦截方式相关推荐

  1. Cloud for Customer里XML view的加载原理

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  2. 老调重弹:JDBC系列 之 驱动加载原理全面解析

    前言 最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读 ...

  3. iOS之深入了解控制器View的加载

    前言 在面试中,面试官可能会问这样的问题,loadView有什么作用,它与viewDidLoad有何区别? 首先我们得知道,控制器view是通过懒加载的方式进行加载的,即用到的时候再加载. loadV ...

  4. 通过加载 QSS 文件的方式美化 QT 界面

    通过加载 QSS 文件的方式美化 QT 界面 1 配置工程 在进行配置之前,建议先在工程的根目录下新建一个 .qss 文件,方便后面的添加 1.打开目标工程,选中此工程,鼠标右键单击 Add New ...

  5. datax底层原理_Datax 插件加载原理

    Datax 插件加载原理 插件类型 Datax有好几种类型的插件,每个插件都有不同的作用. reader, 读插件.Reader就是属于这种类型的 writer, 写插件.Writer就是属于这种类型 ...

  6. Unity导表工具Luban插件的数据加载原理与优化

    文章目录 1. 配置Luban并测试 2. Luban 数据加载原理 3. 根据工程进行懒加载优化 3.1 增加公共接口与接口实现方法 3.2 外部提供获取数据的方法 3.3 对Luban中的导表模板 ...

  7. 【Docker镜像文件加载原理生产中重新制作并提交镜像文件案例演示】

    一.知识回顾 之前的内容都帮你整理好了,在这里哟! [0.Docker相关目录文章整理,可自行查看,包含多节内容] [1.Docker详细安装部署&阿里镜像地址配置] [2.Docker架构& ...

  8. 老调重弹:JDBC系列之驱动加载原理全面解析)

    前言 最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读 ...

  9. js实现图片懒加载原理(marksheng)

    有时候一个网页会包含很多的图片,例如淘宝京东这些购物网站,商品图片多只之又多,页面图片多,加载的图片就多.服务器压力就会很大.不仅影响渲染速度还会浪费带宽.比如一个1M大小的图片,并发情况下,达到10 ...

  10. vue 图片懒加载和懒加载原理

    在真实图片得到之前,展示懒加载设置的图片1.安装cnpm i vue-lazyload -S2.main.jsimport VueLazyload from 'vue-lazyload'Vue.use ...

最新文章

  1. CVPR 2013 录用论文(目标跟踪部分)
  2. 删除文件夹中包含的子文件夹及文件
  3. 网速慢?不!可能是DNS出了问题! 公共DNS优选之 BAT 百度、腾讯、阿里、谷歌DNS哪个更快?
  4. javaEE项目部署方式
  5. JAVA注解和反射(笔记)
  6. 汇编语言王爽第四版(Debug与实验一)
  7. CCS软件仿真 手把手教你 CCS 软件仿真 TMS320F2812
  8. python爬取b站弹幕分析_B站直播弹幕获取 - 用python写一个B站弹幕姬吧
  9. 足球foteball英文
  10. Win-TortoiseGit-使用之-合并代码
  11. Android Studio快速集成讯飞SDK实现文字朗读功能
  12. NLP自然语言处理-英文文本电影影评分类2-pytorch版本
  13. 04、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及利用TIM输出比较配置PWM】
  14. app被下架以后多久能上线?重新上架时间汇总
  15. 元素地牢服务器维修,《元素地牢》已正式开服!劝退地牢等你挑战!
  16. 海信A6/A6L A7Pro/CC A5PRO/A5PRO CC 安装gms google service指南
  17. 【下载查询资料】资料链接
  18. Piwik的数据库表结构
  19. 如何使用Java快速失去一个微信好友
  20. 第二阶段冲刺 每日站立会议 1/3

热门文章

  1. Sublime Text (崇高文本)
  2. 用crontab命令实现每天定时的病毒扫描
  3. Oracle学习笔记之触发器
  4. 解决C#中ListView闪烁的办法
  5. oracle弱口令攻击
  6. 停止MySQL正在执行的SQL语句
  7. thinkphp5 --接口实例
  8. 使用Dom4j创建xml文档
  9. echarts中的option.legend.data has not been defined.
  10. oracle 行列转换 pivot unpivot (本文来自官网)