上面链接中的内容是此篇文章的基础,如果对LayoutInflater原理不熟悉可以去参考一下。
1.问题由来
本来在看CoordinatorLayout的源码,然后发现它内部定义了一个LayoutParams。那么问题就来了,在布局文件中的childView是没有置顶LayoutParams的,那么只有在childView创建的时候,由CoordinatorLayout来指定了。那CoordinatorLayout是在什么时候调用的childView的构造函数的?
在查看ViewGroup源码时发现了一个mChildren属性,类型是View[],显然就是用来保存子View的。
那么问题就出来了:ViewGroup中的mChildren是啥时候初始化的?
2.分析问题
a. 一开始分析的时候真是不知如何下手,首先从ViewGroup源码中查找相关的方法,倒是发现了一个方法addViewInner()在该方法内部,对mChildren进行了赋值和扩容等操作,但是往上跟就发现最后跟到了addView()方法,这是个公共方法,显然是给外部调用的。于是,线索就此中断!
b. 接着我就去网上查stactOverFlow,google一顿查询,无果。
c. 我想着老罗(罗升阳)不是分析Android分析得很深入嘛,去他blog找,找到一篇搭上点边的Android应用程序窗口和View的创建过程 。但人家重点是将View创建的整个流程,并没有讲child是如何添加进来的。
就在我黔驴技穷之际,在老罗的那篇blog中看到了在View创建流程中有一步是setContentView,于是就想在代码中找这个方法的具体代码,没想到这条路还真是走对了,在此谢谢老罗!!
3.解决问题
既然是从setContentView开始的,那就先看它的源码吧。这个方法的真正实现在PhoneWindow.java文件中。
@Override
public void setContentView(int layoutResID) {
if (mContentParent == null) {
installDecor();
} else