欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > Android >内容正文

Android

Android LayoutInflater.inflate源码解析

发布时间:2025/7/25 Android 98 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Android LayoutInflater.inflate源码解析 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一年多以前看过源码,感觉了解比较透彻了,长时间不经大脑思考,靠曾经总结的经验使用inflate方法,突然发现不知道什么时候忘记其中的原理了,上网查了一些资料,还各有不同,反而把我搞糊涂了,还是自己看源码来的实在。

inflate有多个重载方法,不过殊途同归,最后的归宿都是下面这个家伙:

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("**************************");}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");}rInflate(parser, root, inflaterContext, attrs, false);} else {// Temp is the root view that was found in the xmlfinal 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 suppliedparams = 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.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.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;}}

1.首先来看看 root!=null && attachToRoot==true的情况:

if (root != null && attachToRoot) {root.addView(temp, params);}

直接将layout添加至root中,此方法相当于将layout的代码直接放置在root布局的根布局下。

此方法的返回值为root。

2.再看看root!=null && attachToRoot==false的情况:

if (root != null) {params = root.generateLayoutParams(attrs);if (!attachToRoot) {temp.setLayoutParams(params);}}

此方法返回的值为layout,且layout中设置了自己的layoutParams。

3.最后就是root==null的情况了:

此方法返回的也是layout,与第二种情况不同的是layout中不含layoutParams。

 

注:与第1中情况不同,第2和第3种情况需自己调用addview方法添加至相应布局中。

 

总结:

1. root!=null && attachToRoot==true  ----->  将layout完全地添加到root中,返回root。

2. root!=null && attachToRoot==false------>  返回的layout(包含layoutParams)

3. root==nul ------------------------------->  返回layout(不包含layoutParams)

 

转载于:https://www.cnblogs.com/zhisuoyu/p/5924396.html

总结

以上是生活随笔为你收集整理的Android LayoutInflater.inflate源码解析的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。