android inflate源码解析

在开发中,我们经常使用Layoutinflater对象的inflate()方法,他是将xml布局文件实例化为一个view;
关于infalte使用:
我们常见的有两种:
1)将xml文件布局实例化为View对象
LayoutInflater.from(context).inflate(int resoure,viewGroup root){}
2)将xml文件布局实例化为view对象,并添加到ViewRoot布局中
ViewGroup viewRoot;
LayoutInflater.from().inflate(int resoure,viewRoot){}
这个两个常用的方法有什么不同?
我们通过源码分析,主要是将方法的第三个参数中root设置为不是null;
下面我们通过源码来讲解之间的区别:
从源码中可以看到:
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上。

通过上面源码的分析,得出结论:
1)当root!=null attachToRoot为false:
设置LayoutParams在子view上,改变xml布局的宽高等属性,(白话讲解:举例:listview 的item布局指定了具体宽高,在listview列表显示时:会相应这个宽高,)
2)当root!=null attachToRoot为true:
把子View放到root中,并改变xml布局的宽高;
3)root==null;
没有设置LayoutParams在子view上;

3.总结相关问题:
adapterView不能用addView(),会报错

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值