View被添加到页面的过程

在执行LayoutInflater.inflate()方法的时候会去解析xml文件。创建每个视图对象。

我们在设置View的位置大小的时候,经常需要用到一个叫LayoutParams的东西,并且我们在使用这个LayoutParams的时候经常要判断他的LayoutParams对象是不是他的父类.LayoutParams。那么问题来了,这个LayoutParams到底是什么时候创建的,他为啥必须是父类的LayoutParams。

为了解决这个问题,我们就需要看view对象创建出来的代码了。也就是在调用LayoutInflater.inflate方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// LayoutInflater
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {
// .......
View view = tryInflatePrecompiled(resource, res, root, attachToRoot);
// .......
}

View tryInflatePrecompiled(@LayoutRes int resource, Resources res, @Nullable ViewGroup root,
View view = (View) inflater.invoke(null, mContext, resource);
XmlResourceParser parser = res.getLayout(resource);
try {
AttributeSet attrs = Xml.asAttributeSet(parser);
advanceToRootNode(parser);
ViewGroup.LayoutParams params = root.generateLayoutParams(attrs);
if (attachToRoot) {
root.addView(view, params);
} else {
view.setLayoutParams(params);
}
return null;
}

通过上面这个代码可以看到调用了父类的generateLayoutParams方法去创建了LayoutParams对象。

1
2
3
4
// ViewGroup
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new LayoutParams(getContext(), attrs);
}