Android--LayoutInflater解析
来源:互联网 发布:淘宝装修免费一键安装 编辑:程序博客网 时间:2024/06/05 00:22
每次都很好奇activity的setcontentview()方法是内部是怎么实现的呢?结果是调用window的setcontentView,然而window是抽象类,所以其实调用的是PhoneWindow.类。
在一步步查看里面的代码呢:
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) { synchronized (mConstructorArgs) { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "inflate"); final Context inflaterContext = mContext; final AttributeSet attrs = Xml.asAttributeSet(parser); Context lastContext = (Context) mConstructorArgs[0]; mConstructorArgs[0] = inflaterContext; View result = root; try { // Look for the root node. int type; while ((type = parser.next()) != XmlPullParser.START_TAG && type != XmlPullParser.END_DOCUMENT) { // Empty } if (type != XmlPullParser.START_TAG) { throw new InflateException(parser.getPositionDescription() + ": No start tag found!"); } final String name = parser.getName(); if (DEBUG) { System.out.println("**************************"); System.out.println("Creating root view: " + name); System.out.println("**************************"); }//判断是否merge节点 if (TAG_MERGE.equals(name)) { if (root == null || !attachToRoot) { throw new InflateException("<merge /> can be used only with a valid " + "ViewGroup root and attachToRoot=true"); }//调用这个方法加载父布局以及里面的子view,通过深度查找一层一层的生成view rInflate(parser, root, inflaterContext, attrs, false); } else { // Temp is the root view that was found in the xml
//通过反射解析view final View temp = createViewFromTag(root, name, inflaterContext, attrs); ViewGroup.LayoutParams params = null; if (root != null) { if (DEBUG) { System.out.println("Creating params from root: " + root); } // Create layout params that match root, if supplied params = root.generateLayoutParams(attrs);
//是否添加父布局 if (!attachToRoot) { // Set the layout params for temp if we are not // attaching. (If we are, we use addView, below) temp.setLayoutParams(params); } } if (DEBUG) { System.out.println("-----> start inflating children"); } // Inflate all children under temp against its context.
//解析这个view的子view rInflateChildren(parser, temp, attrs, true); if (DEBUG) { System.out.println("-----> done inflating children"); } // We are supposed to attach all the views we found (int temp) // to root. Do that now.
//把解析的view添加到root里面去 if (root != null && attachToRoot) { root.addView(temp, params); } // Decide whether to return the root that was passed in or the // top view found in xml. if (root == null || !attachToRoot) { result = temp; } } } catch (XmlPullParserException e) { InflateException ex = new InflateException(e.getMessage()); ex.initCause(e); throw ex; } catch (Exception e) { InflateException ex = new InflateException( parser.getPositionDescription() + ": " + e.getMessage()); ex.initCause(e); throw ex; } finally { // Don't retain static reference on context. mConstructorArgs[0] = lastContext; mConstructorArgs[1] = null; } Trace.traceEnd(Trace.TRACE_TAG_VIEW); return result; } }
大致流程图如下:
2 0
- Android LayoutInflater深度解析
- Android LayoutInflater深度解析
- Android LayoutInflater深度解析
- Android LayoutInflater深度解析
- Android LayoutInflater深度解析
- Android LayoutInflater深度解析
- Android LayoutInflater源码解析
- Android LayoutInflater深度解析
- Android--LayoutInflater解析
- android LayoutInflater源码解析
- 【Android】LayoutInflater深度解析
- Android LayoutInflater 源码解析
- Android LayoutInflater使用解析
- Android LayoutInflater 源码解析
- Android LayoutInflater 源码解析
- Android LayoutInflater原理解析
- Android LayoutInflater深度解析
- android LayoutInflater、setContentView、findviewbyid 区分解析
- maven+proguard第三方jar打包混淆
- 小记录
- python爬虫
- Laravel5.x启动过程分析
- Linux下Socket编程函数格式详解
- Android--LayoutInflater解析
- Hibernate 性能优化
- Java的Spi机制心得
- 安全字符串函数stringcchXXX与 stringcbXXX什么区别?
- MyBatis的动态SQL详解
- CookieUtils
- MyBatis 解决字段名与实体类属性名不相同的冲突
- 常用tcp协议交互的分析解读及与socket编程之间的关系
- H3C交换机怎么划分VLAN