LayoutInflater的inflate方法

public View inflate(int resource, ViewGroup root, boolean attachToRoot)

该方法的目的是根据第一个参数指定的xml文件获得一个视图。但是这个被返回的视图根据第二个和第三个参数的设置会有所不同。可以看一下inflate方法最终执行时的部分代码:

首先该方法最终执行的是

inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)
这样一个方法,重点还是看第二个和第三个参数

public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) {
        synchronized (mConstructorArgs) {
            final AttributeSet attrs = Xml.asAttributeSet(parser);//利用parser,xml文件中的参数读取了出来
           //部分代码略去
           //变量result未来就是该方法的返回值,现在先将它的值设定为第二个参数
           View result = root; 
                    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
                        // 作为ViewGroup类型的root参数会根据之前从xml文件中读取的属性内容创建LayoutParams对象
                        // LayoutParams对象的作用不用多说了,为子视图提供覆盖父视图同名默认属性的属性值
                        params = root.generateLayoutParams(attrs);
                        if (!attachToRoot) {//如果第三个参数为false
                            // Set the layout params for temp if we are not
                            // attaching. (If we are, we use addView, below)
                            // temp是利用xml文件膨胀出来的布局文件的根视图,为它指定LayoutParams
                            temp.setLayoutParams(params);
                        }
                    }

                   //略去部分代码...
                    if (root != null && attachToRoot) {
                   //如果第二个参数不为null且第三个参数为true,就为temp指定自己的LayoutParams并添加到第二个参数中
                        root.addView(temp, params);
                    }

                    // Decide whether to return the root that was passed in or the
                    // top view found in xml.
                    // 如果第二个参数为空或者第三个参数为false,那么让temp赋值给result(在方法开始时,result的值引用的是root)
                    if (root == null || !attachToRoot) {
                        result = temp;
                    }
                }

            } 

            //略去catch和finllay代码
            //最终返回result时,result有可能有两种值,1)添加了temp的root 2)temp本身
            return result;
        }
    }

通过以上代码可以知道,如果能明确知道你要膨胀出来的视图应该添加到那个父视图中,就不应该让第二个参数为null,要不然所有xml文件中写的属性虽然都被读了出来,但是都不会被设置到膨胀的视图中去。一个视图的宽度、高度、外边距这些属性都是有它的父视图确定的,如果你根本就不指定父视图,这些参数只能被忽略。被忽略后的视图添加到一个父视图中,因为它没有自己的LayoutParams,所以所有属性都只能接受父视图默认的同名属性。类似的情况在使用setContentView方法的时候也有体现,如果指定的参数是view的时候,view会以父视图的默认参数来设置,如果是setContentView(view,params)的话,view会按照params中的内容来设置参数。

第三个参数,如果认为有必要添加到root中,就写成true,比如使用android.r.layout.simple_item_1作为布局文件的时候,它的根视图是TextView,可以把它添加到root中,还有一种情况,如果根节点是<merge>的布局文件,必须要添加到父节点中。而对于我们大多数我们自己写的布局文件已,本身的根节点已经是ViewGroup了(比如LinearLayout,RelativeLayout等),就没有必要添加到root中了,这是第三个参数指定false就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值