LatoutInflate 主要的作用是实例化一个 xml 文件,使得开发者获取一个 View 的实例(也可以看着把一个 xml 文件渲染成一个视图)。在 LayoutInflate 的内部,LayoutInflate 拿到自身的实例,一般通过 android.app.Activity#getLayoutInflater()
方法,或者通过 Context#getSystemService
来拿到已经在应用中的 LayoutInflate 实例(系统早已经配置好了 LayoutInflate 实例)。
1 | [源码 1] |
在 [源码 1] 中,inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
方法里面三个参数分别表示:
resource
参数表示需要渲染的 xml 布局资源root
如果attachToRoot
设置为 true,则生成结构层次的父级; 如果设置为 false,则返回结构层次提供的一组 LayoutParams 值的对象(这个值可能为空); [ViewGroup
是一个包含其他视图的特殊的 View,可以看作一个视图容器]attachToRoot
渲染的视图的结构层次是否捆绑父视图的参数,如果设置为 false,则表示需要捆绑;
在 [源码 1] 中的解析 1处,会调用方法 inflate(parser, root, attachToRoot)
,下面是查看其源码:
1 | [源码 2] |
上面 [源码 2] 主要的逻辑是把从 inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {synchronized (mConstructorArgs)
的方法中传进的 root 参数(该参数为需要渲染的 xml 布局),经过 createViewFromTag(root, name, inflaterContext, attrs)
的方法拿到该 root 视图的实例,因为 root 不为空,所以在注释 2、3 处,为该视图布局绑定布局参数,带视图参数返回视图的实例;
如果 root 参数在 inflate
方法传进来的时候为空,侧直接返回该 xml 视图的实例,但没有绑定布局参数;