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