UI绘制流程详解(2)
从源码角度分析一下三个问题
本文主要研究第二个问题
二、在Activity onCreate当中我们的setContentView是如何将UI文件加载?
注意:这里我们主要分析继承Activity的setContentView流程
首先,进入setContentView查看源码
getWindow的对象是mWind,类名是Window
这个Window类是一个抽象类,也就是说刚刚的setContentView是他的实现类所调用的。Window类上有一句注释,大概的意思是:这个Window的实现类有且只有一个实现类,那就是PhoneWindow。所以说,setContentView方法实际上市PhoneWindow来调用的,查看源码
有三个地方需要需要注意
第一个是注释,也就是所让注意的说明,我理解的大概意思就是:主题属性等的设置在应该在安装window decor之前,而FEATURE_CONTENT_TRANSITIONS在安装window decor的时候被设置。这里面提到了 installing window decor,而下面正好有一个方法installDecor,这就是我们第二个需要注意的地方。我们点击去查看:
翻阅这个方法的代码大概了解到主要是对两个属性的初始化:mDecor及mContentParent,查看这两个属性的注释
// This is the top-level view of the window, containing the window decor.
//这是窗体的*布局,包含了窗体的decor
private DecorView mDecor;
// This is the view in which the window contents are placed. It is either
// mDecor itself, or a child of mDecor where the contents go.
//窗口的内容放置在这个view上面。它或者是mDecor本身,或者是mDecor的子view
ViewGroup mContentParent;
注释很清楚的说明了两个属性的作用及关系。mDecor的初始化器没什么可说的。mContentParent的初始化器的名字叫做generateLayout,肯定和布局有关,查看源码:
这个方法中的代码篇幅比较长,但是需要注意的只有上面两个
第一个图片的翻译是窗体decor的渲染,而layoutResource是布局资源的索引,在第二张图片里,mDecor调用了onResourcesLoaded方法对布局资源进行了记载,查看这个方法源码:
这句代码大家肯定都很熟悉,渲染了布局资源,这个布局资源使我们自己的布局吗,我们查看上上张图片的R.layout.screen_simple(以它为例)
这么一看,就是到肯定不是,那这个布局是什么呢,我盗用KerwinBarry博客中的图片说明
有小伙伴对右边的图片应该比较熟悉,就是系统的基本布局。而关于installDecor方法的查看在这里就是结束了,而installDecor方法做的事情就是:(1)加载了布局的容器(2)加载了系统的基本布局
回到第一幅图中,mLayoutInflater.inflate(layoutResID, mContentParent);这句代码就很好理解了,就是加载自己的布局资源
通过上面的分析,对于在Activity onCreate当中我们的setContentView是如何将UI文件加载这个问题的答案已经很清楚了
欢迎留言,欢迎纠错,共同进步!
上一篇: 剑指offer-把数组排成最小的数