版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/maosidiaoxian/article/details/81702884
LayoutInflater
常用的两个方法:
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root)
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
第一个方法的调用如下:
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) {
return inflate(resource, root, root != null);
}
而在其实现中,第二个参数 ViewGroup
类型的 root
是否为空,会决定在从布局文件创建 View
的时候,是否生成根元素的布局参数(即以 layout_
开头的属性),关键代码如下:
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);
}
}
也就是当其为空时,那么所创建的 View
的布局参数也为空,这样就可能类似于导致在布局定义时对根元素明明定义了 match_parent
的值但是显示出来的却是 wrap_content
的问题。
而最后的 boolean
参数则是当 root
参数不为空时,是否添加到 root
中。
if (root != null && attachToRoot) {
root.addView(temp, params);
}
在 Adapter 或 Fragment
的创建中,一般传 false
即可,因为 fragment 或 adapter 会自己添加到对应的容器中,如果传 true
添加了的话,反而会导致报错提示 view 已经有了 parent。
另外,当 root
为空或者 attachToRoot
参数为 false
时,返回的是所创建的 view,否则返回的是 root
。
下面是我的公众号,欢迎关注。