1、UI结构,从Activity的setContentView()入手;了解xml布局的嵌套关系
第一步、根据代码,源码中找到Actitivyt中setContentView()方法的实现,这里我用的是http://androidxref.com/在线源码阅读平台,选择8.0源码
/**
* Set the activity content from a layout resource. The resource will be
* inflated, adding all top-level views to the activity.
*
* @param layoutResID Resource ID to be inflated.
*
* @see #setContentView(android.view.View)
* @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
*/
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
我们从activity中setCotentview()调用了getWindow().setContentView()方法。我们可以看到他调用了getWindow()方法,这个方法返回的是一个window对象。所以我的目标就转移到了Window类
第二步、Window是一抽象类,它提供标准的UI策略,例如背景、标题区域,默认密钥处理,它只有一个实现类PhoneWindow。我们在PhoneWindow中找到setContentView()方法
官网注释:这是放置窗口内容的视图,它要么是DecorView本身,或者是一个DecorView的子view。
这里猜测,mContentParent就是一个放置窗口内容的一个容器,父布局;
再进入installDecor();方法中查看,找到给mContentParent赋值的地方
接着再进入generateLayout()方法,最终找到给mDecor加载资源的地方
这里对象mLayoutInflater就是用来加载布局文件的,layoutResource就是要加载的布局id,前面一堆条件判断就是为layoutResource赋值,
这里layoutResource = R.layout.screen_simple
第三步、此时再找到DecorView中的onResourcesLoaded查看,
最终这个资源被加载到跟布局中;
总结一下以上流程,只是做了布局的初始化工作,将布局文件加载到了mContentParent中,但是还没有加载到Window中以及布局的绘制工作都没完成;
这里完成的跟布局大体结构如下:
那么decorView是如何添加到window上的呢,ui又是怎么样渲染绘制上去的呢?请看