public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
LayoutRes int resource:
当前需要显示的layout资源ID
ViewGroup root:父view
boolean attachToRoot:
是否绑定到root view:resource是否作为root ViewGroup的Child
- root != null && attachToRoot = true
resource用自己的ViewGroup.LayoutParams 属性 ,resource作为attachToRoot子view并添加到ViewGroup中,resource自己的LayoutParams属性就不会失效。
返回View 是root 的ViewGroup。
- root != null && attachToRoot = true
- root != null && attachToRoot = false
resource用root的ViewGroup的属性,resource 作为单独View存在。
resource自己的LayoutParams(大小/位置)属性就会失效。
返回的View 是resource View。
- root != null && attachToRoot = false
- root == null && attachToRoot = true
无意义,因为root == null 会报异常
throw new InflateException("<merge /> can be used only with a valid "
+ "ViewGroup root and attachToRoot=true");
- root == null && attachToRoot = true
注意这里说的resource只是针对 resource自己的跟节点失效。
如下面layout 》LinearLayout 的android:gravity属性,而并非Button的android:layout_width
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@color/colorPrimary"
android:gravity="center"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
1和2的效果是一样的
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
1.View view = inflater.inflate(R.layout.linearlayout, ll, true)
- View view = inflater.inflate(R.layout.linearlayout, ll, false)
ll.addView(view);
源码如下
//当调用1.0 resource 会调用1.1
1.0 View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
1.1 View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot)
1.2 //创建匹配根目录的布局参数
params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
//设置临时的布局参数,temp为root的布局参数
temp.setLayoutParams(params);
}
1.3 if (root != null && attachToRoot) {
//当attachToRoot == true添加到root容器中
root.addView(temp, params);
}