LayoutInflater源码解析

2017-06-25  本文已影响0人  咖啡少年不加糖whm

转载请注明出处: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.

上一篇下一篇

猜你喜欢

热点阅读