美文网首页
View的加载与绘制(一)

View的加载与绘制(一)

作者: TianFB | 来源:发表于2019-05-15 17:57 被阅读0次

每次我们创建一个Activity的时候都会通过setContentView( layoutResID )方法,将自定义的布局文件添加到Activity上。启动程序后我们自定义的布局就会显示到手机上。接下来我们从源码的角度来分析一下自定义的布局文件显示的过程。

View的加载过程

实际开发中我们创建Activity一般都继承 AppCompatActivity,但是在低版本的时候继承Activity。所以对于setContentView( layoutResID ) 就有了两种情况 。接下来我们就根据不同的父类分析一下。

1、继承自 AppCompatActivity 

方法调用图 界面层级图 

我们先看 AppCompatActivity 中的源码

> AppCompatActivity 中的源码很简单。首先通过 AppCompatDelegate 的静态方法 create( ) 创建了一个AppCompatDelegate 实例。并调用该实例的 setContentView 方法。 

接下来看看AppCompateDelegate的源码

通过上面的源码我们发现 AppCompateDelegate 是一个抽象类,它的create方法中返回的是它的子类AppCompatDelegateImpl 的实例。

接下来就看一下 AppCompatDelegateImpl 中的方法

AppCompatDelegateImpl 的构造方法就是初始化关联的Context和Window。setContentView()方法中先创建一个mSubDecor(ViewGroup)并将我们自定义的布局加载到mSubDecor中的ID为content的子View中。将mSubDecor添加到Window是通过createSubDecor()中mWindow的getDecorView()和setContentView()。我们知道Window是一个抽象类它的唯一子类是PhoneWindow。

接着我们去看PhoneWindow的源码。

上面的源码就是创建了一个FrameLayout类型的DecorView,然后根据不同的条件初始化一个layoutResource 资源ID,每一个layoutResource 中都会含有一个id为android.R.id.content的ViewGroup,将layoutResource对应的布局add到DecorView中。mContentParent就是Id为content的ViewGroup。

然后将 AppCompatDelegateImpl 中创建的mSubDecor添加到mContentParent中。这样我们的布局文件就加载到Window上了。

2、直接继承Activity

此时的setContentView调用的是Activity中的。那接下里看一下Activity的相关源码

Activity中的方法很简单就是获取了Window对象并调用了它的setContentView()方法。接下来就是PhoneWindow里面的源码了

上面的代码中重要的两个步骤就是installDecor()方法,第一个就是我们在上面已经分析过的创建了一个DecorView对象然后根据不同的设置初始化一个layoutResource布局资源,并将该资源加载到DecorView中返回一个id为content的View即mContentParent。第二个就是将我们的布局加载到mContentParent中。

View的加载与绘制(二)

> 该文档是自己的学习记录如有错误欢迎指出。

相关文章

网友评论

      本文标题:View的加载与绘制(一)

      本文链接:https://www.haomeiwen.com/subject/pzukaqtx.html