ViewGroup是如何加载布局中的view?

LayoutInflater如何加载布局?

上面链接中的内容是此篇文章的基础,如果对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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值