微知识#0 layoutInflater.inflate 方法的 ViewGroup 参数

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

下面是我的公众号,欢迎关注。
浩码农的公众号

猜你喜欢

转载自blog.csdn.net/maosidiaoxian/article/details/81702884
今日推荐