android inflater详解以及源码解析

来源:互联网 发布:乐思网络信息采集系统 编辑:程序博客网 时间:2024/05/29 07:27
1.在开发中,我们经常需要使用到LayoutInflater,通过该对象的Inflate()方法,将一个layout布局文件实例化为view
2.inflate()方法的使用?
在实际使用中,我们一般会用到inflate的以下两个重载方法
方法一:
  1. public View inflate(int resource, ViewGroup root) {}  
方法二:
  1. public View inflate(int resource, ViewGroup root, boolean attachToRoot) {}  
其中方法一最为常见
常见使用案例一:
View myView= LayoutInfalter.from(context).inflate(R.layout,my_view,viewRoot);
将布局文件/res/layout/my_view.xml实例化为myView对象。

常见使用案例二:
  1. ViewGroup viewRoot;  
  2. LayoutInflater.from(context).inflate(R.layout.my_view, viewRoot);  
将布局文件/res/layout/my_view.xml实例化的View对象添加到viewRoot布局中。
那么方法一与方法二有什么区别?
进入方法一的源码,我们会发现在内部调用的其实就是方法二,只是将方法二的第三个参数设为“root!=null
  1. public View inflate(int resource, ViewGroup root) {  
  2.     return inflate(resource, root, root != null);  
  3. }  
方法二中的参数和返回值释义,
参数:
resource:需要实例化的布局资源id
root: viewGroup 类型视图组对象
attachToRoot:是否将resource实例化后的view添加到参数Root中:
返回值:
如果root为空,直接返回resource实例化后的view对象:
如果root不为空,attachToRoot为true,将resource实例化为view对象,忽略view的最外层视图在xml布局中定义的属性,将view添加到root中,并将root返回,
如果root不为空,attachToRoot为false,将Resource实例化为view对象,为view的最外层视图设置其中在xml布局中定义属性,并将view对象返回,

2,对inflate()方法的源码解析
从源码中可以看到:
1)final AttributeSet attrs = Xml.asAttributeSet(parser);
将子view的属性赋值给attrs;
2 )View result = root;
首先声明了View result=root;最终返回值为result
3)temp = createViewFromTag(root, name, attrs);
temp = createViewFormTag(root,name,attrs); 这个是构建出一个子view
4)if (root != null) { params = root.generateLayoutParams(attrs);if (!attachToRoot) {temp.setLayoutParams(params);}}
通过上面的代码可知(源码被简化)
如果 root!=null,并且attachToRoot为false;
创建temp,然后执行temp.setLayoutParams(params);返回temp(改变外层布局的宽高)
5)// We are supposed to attach all the views we found (int temp // to root. Do that now.
if (root != null && attachToRoot) {root.addView(temp, params);
}
通过上面的源码可知;
如果root!=null,并且,并且attachToRoot为ture;
创建temp,然后执行root.addView(temp,params);最后返回root。
(把子view放到root里,并把宽高设置上,)
6) if (root == null || !attachToRoot) {result = temp;}
通过上面的源码可知:
如果root==null,只创建temp,返回temp
(没有设置LayoutParams)在子view上。
7)adapterView不能用addView(),会报错



原创粉丝点击