搜索
写经验 领红包

预知view是如何加载到界面的且从源码开始(预加载webview)

导语:预知View是如何加载到界面的,且从源码一一道来

最近闲的没事,就想要理清我们的View是如何加载到界面中的,那最好的方式就是分析源代码了,这里一同分享给有需要的朋友们。

我们都知道,在开发Android应用程序时,经常会在Activity的onCreate方法里调用setContentView方法,将布局文件或者View对象传入,但是很多人并没有去分析后续是如何加载到面并显示出来的,接下来就顺藤摸瓜将其摘下来,查看的是Android 7.1源码。

1、摸索setContentView 方法

查看其父类Activity的setContentView方法,代码如下:

可以看出这里先得到一个 Window 对象,然后调用 Window 对象的setContentView方法。

这样由Activity中的 setContentView 方法可以看到,界面绘制并不是由 Activity 完成的,是调用了 Window 类的 setContentView 来实现的。所以我们就去看看 Window 类的代码:

我们可以看到, Window 类其实是一个抽象类,并且 setContentView 是一个抽象方法。所以说,其具体实现是由 Window类的实现类来完成的(后面我们会知道该实现类是PhoneWindow)。

2、找出Window类的实现类

为了找出Window类的具体实现类,回到Activity的setContentView方法,进入getWindow方法:

getWindow 方法很简单,只是返回一个Window对象,那么Window对象到底是在哪儿实例化的呢?接着我们继续寻找Window对象的实例化代码,最终确认在Activity类的attach方法里面:

由此可见上面的Window对象就是PhoneWindow对象,所以我们从Activity的setContentView方法定位到了PhoneWindow的setContentView方法。

3、探究PhoneWindow类的setContentView方法

从源码可以知道,这里主要包括三个步骤:如果父容器为空则初始化父容器,否则移除所有子视图;调用LayoutInflater类的inflate方法将View加载到父容器;回调Callback通知ContentView发生改变。

接下来再分别对这几个步骤进行挖掘。

4、追寻父容器

进入PhoneWindow类的installDecor方法:

本文内容由小彤整理编辑!