LayoutInflater源码解析

转载请注明出处:http://www.jianshu.com/p/011d526448a0

     我们在自定义View、视图中动态添加View以及我们在Adapter中和Fragment中都会用到LayoutInflater,下面我们就来分析一下LayoutInflater的源码。

     LayoutInflater的创建方式有三种情况,分别是

         1、LayoutInflater mInflater = mContext.getLayoutInflater();

         2、LayoutInflater mInflater = LayoutInflater.from(mContext);

         3、LayoutInflater mInflater = mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

     我们先来解析LayoutInflater.from(mContext);

        我们查看源码发现,LayoutInflater调用的from()方法创建的LayoutInflater其实就是调用我们的Context类中的getSystemService()抽象方法,我们都知道,getSystemService()是Android提供的非常重要的API,通过传入一个name然后获取到Object;

       然后我们来看mContext.getLayoutInflater();

        在Activity中源码是直接调用Windwo的getLayoutInflater()抽象方法,然后我们知道,在Activity绘制的时候,首先绘制的是Window的子类PhoneWindow,我们看PhoneWindow的源码发现,PhoneWindows重写了getLayoutInflater()方法,然后返回一个LayoutInflater,然后在构造函数中直接调用的LayoutInflater.from()来创建的LayoutInflater

      通过分析源码我们发现,LayoutInflater的三种创建方式,其归根结底都是使用了mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);来进行创建的,然后我们再来分析一下LayoutInflater添加布局用的inflate()方法,我们一般在添加布局的时候,基本都是都用的                                  View view = mInflater.inflate(R.layout.xxx, null);这样的方式来添加我们定义的布局文件,那我们首先来看下inflate()方法的源码

我们看到,其实inflate(resurce, root)在调用了自己的重载inflate(resource, root, root!=null)方法,然后我们在看这个方法

我们首先发现,这里做的操作首先是获取资源对象,然后通过XMLResourceParser读取我们的布局文件,最后有调用了自己的重载方法inflate(parser, root, attchToRoot)方法,我们继续看这个方法

由于这个方法太长了,所以我就只截取了一半,有兴趣的同学可以仔细阅读,然后我就主要说下这个inflate主要做了哪些事情,

1,首先是通过使用XmlPullParser类将我们xml布局文件转转换成View。

2,然后通过判断我们传递进来的ViewGroup是否为null来决定是否需要给View设置LayoutParams。

3,通过判断attachToRoot是否为true来决定是否把View添加到ViewGroup中,

4,最后就是return View.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • LayoutInflater我们经常会用到,在列表适配器中或者在加载自定义布局时,它的作用就是将一个xml文件渲染...
    shenhuniurou阅读 760评论 0 2
  • LayoutInflater 在开发中是经常使用的一个类,一般我们都通过 from 方法获取 LayoutInfl...
    任教主来也阅读 344评论 0 5
  • 最新在阅读《Android源码设计模式解析与实战》一书,我觉得写的很清晰,每一个知识点都有示例,通过示例更加容易理...
    慕涵盛华阅读 302评论 2 3
  • 用法获取LayoutInflater 首先要注意LayoutInflater本身是一个抽象类,我们不可以直接通过n...
    我本和图阅读 935评论 0 0
  • 我们似乎都有一个神器 让我们在这个光怪陆离的世界里 貌似多了一分胜算 可是 有一天 我想卸下所有的防备 撕毁所有唯...
    上有岚天阅读 313评论 1 4