LayoutInflater.inflate源码分析
2015-08-16 11:24
267 查看
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/3697ec77-2f53-45be-b090-aa0c3b3d02bf.png)
基于Android 4.2.2做的分析
![](https://images0.cnblogs.com/blog2015/341906/201508/161106374429914.png)
![](https://images0.cnblogs.com/blog2015/341906/201508/161107035827395.png)
parser里封装了layout的dom对象,从中可以获取各节点参数
![](https://images0.cnblogs.com/blog2015/341906/201508/161107318793316.png)
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/e1586b20-ef96-412c-a549-bb0bdc23788f.png)
root为layout对应根节点的父节点,其作用见上述文档解释,需要注意一点的是,root的作用主要有两个:
1.根据root的类型(RelativeLayout/LinearLayout),结合layout配置的attrs创建layoutParams,
如root为RelativeLayout时,layout中设置toleftof,则创建的RelativeLayout.LayoutParams中会保存该属性。
2.为layout的viewgroup设置该layoutParams
![](https://images0.cnblogs.com/blog2015/341906/201508/161108436293462.png)
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/233f3192-6835-44df-8ff2-0fa9229ded71.png)
对于layout的子节点,采用递归函数设置
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/184f2621-c3c2-4963-ba12-929f633e1f94.png)
![](https://images0.cnblogs.com/blog2015/341906/201508/161109081148716.png)
这里主要分析下params = root.generateLayoutParams(attrs);和temp.setLayoutParams(params);
假定root类型为RelativeLayout,则generateLayoutParams会调用如下:
![](https://images0.cnblogs.com/blog2015/341906/201508/161109346765667.png)
![](https://images0.cnblogs.com/blog2015/341906/201508/161110055677830.png)
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/922d0a1a-7c92-4bba-94ad-b33e9e64cdd1.png)
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/4e4a9045-592c-401a-9b53-fa5192325ca9.png)
其父类为ViewGroup.MarginLayoutParams,其构造函数如下:
![](https://images0.cnblogs.com/blog2015/341906/201508/161110483798483.png)
![](https://images0.cnblogs.com/blog2015/341906/201508/161111036298358.png)
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/3b0958d2-1e42-40e2-8454-e88e5e12210c.png)
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/a5517607-e3eb-4f9e-9d91-985df1f309cb.png)
可以看到父类中会根据attrs设置layoutParams对象中的基本属性:宽高、margin
而子类中则负责relativelayout特有的属性设置,如below/toleftof/above/alignXXX属性:
![](https://images0.cnblogs.com/blog2015/341906/201508/161111522235979.png)
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/3ad64c7b-ee71-4b4a-811c-8448b30a5e7a.png)
若layout文件中顶级节点如下,而其root为RelativeLayout,则上述操作便是设置红框内的属性,而setLayoutParams的作用为使其生效。
![](https://images0.cnblogs.com/blog2015/341906/201508/161112249106327.png)
![](https://images0.cnblogs.com/blog2015/341906/201508/161112398644759.png)
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/51cff8a6-729e-457c-af40-78ad457c635d.png)
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/669f3250-dc2e-4d40-a39f-a341a794cace.png)
该函数的作用描述如下:
![](https://images0.cnblogs.com/blog2015/341906/201508/161113218014313.png)
![](file:///D:/QQPCmgr/Documents/My%20Knowledge/temp/b762cc43-020c-426f-873f-a5e5f9f7ed46_4_files/1b74c6dd-62b6-4d56-8caf-5556f0a9c8a0.png)
这里的mParent就是root
综上若attach=false时,root的作用就是为使得layout的layout_params生效,建议在onCreate/onCreateView/onCreateContentView中inflate使用root参数,避免布局失效。
比如layout中设置顶级节点android:layout_height="184dp",但若inflate时root=null,则实际显示时layout_xxx不生效
Ref: http://blog.csdn.net/xyz_fly/article/details/37932989
相关文章推荐
- Andriod Studio科普文章——3.大约gradle常见问题插头
- USACO:2.2.2 Subset Sums 集合和
- 取石子游戏
- for循环
- struts2学习笔记(十一)文件上传
- 如何设置eclipse的自动补齐功能
- 数据结构读书笔记1
- IOS拉伸之底盖设置
- 关于Cocos2d-x的CC_SYNTHESIZE 和 CC_SYNTHESIZE_READONLY 宏的作用
- Android ADB工具-管理设备/取设备硬件信息(一)
- POJ 2001 Shortest Prefixes(字典树)
- UVA 10294 Arif in Dhaka (置换polya)
- Android之assets资源
- codeforces 570 c
- 我开发的第一个Android软件
- AC算法初探
- POJ1915 Knight Moves(宽搜经典题目)
- Android Resources
- 电脑显示U盘,但是读取不了
- hdu 5391 (数论)