4

第一种方法:

LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, parent, true);

第二种方法:

LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, null, false);
parent.addView(child);

有什么区别吗?

4

6 回答 6

3

如果您检查 inflate 方法的来源,您会发现:

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);
     }
}

/* ... */

// We are supposed to attach all the views we found (int temp)
// to root. Do that now.

if (root != null && attachToRoot) {
    root.addView(temp, params);
}

所以在你的例子中没有区别。

在这种情况下会有所不同

View child = LayoutInflator.inflate(context, parent, false);

一个孩子将拥有与父母相同的 LayoutParams 但它不会被附加,所以它只是单独的视图。

于 2013-07-17T02:25:03.620 回答
1

根据 Android 开发者文档:

View child = LayoutInflator.inflate(context, parent, true);

将孩子添加到父母,

View child = LayoutInflator.inflate(context, null, false);

将不会。

您可以查看参考:android.view.ViewGroup.inflate

于 2013-07-17T02:13:00.587 回答
0

不同之处在于您的第二个参数,它基本上告诉 Android 哪个 View 是您正在充气的那个 View 的父 View。

在第一种情况下,视图将被膨胀到作为“父”实例的 ViewGroup 中。在第二种情况下,新创建的 View 没有父级,将按原样膨胀。

于 2013-07-17T02:12:36.210 回答
0

是,有一点不同。

if True:膨胀的层次结构是否应该附加到根参数?

if False:如果为 false,则 root 仅用于为LayoutParamsXML 中的根视图创建正确的子类。

当我们不想使用 Adapter 类在 Listview 中添加行时,通常使用此参数,我们希望逐个视图或布局制作它们具有子视图的情况,在这种情况下我们使用它。

于 2013-07-17T02:13:13.860 回答
0

假设您调用context了资源 id 来膨胀,这很令人困惑。有以下区别:

从布局资源顶层使用布局参数,因为parent布局参数。在第二种情况下,不会应用这些布局参数;

于 2013-07-17T02:13:31.213 回答
0

源代码如下:

471                    if (root != null) {
472                        if (DEBUG) {
473                            System.out.println("Creating params from root: " +
474                                    root);
475                        }
476                        // Create layout params that match root, if supplied
477                        params = root.generateLayoutParams(attrs);
478                        if (!attachToRoot) {
479                            // Set the layout params for temp if we are not
480                            // attaching. (If we are, we use addView, below)
481                            temp.setLayoutParams(params);
482                        }
483                    }
484
485                    if (DEBUG) {
486                        System.out.println("-----> start inflating children");
487                    }
488                    // Inflate all children under temp
489                    rInflate(parser, temp, attrs, true);
490                    if (DEBUG) {
491                        System.out.println("-----> done inflating children");
492                    }
493
494                    // We are supposed to attach all the views we found (int temp)
495                    // to root. Do that now.
496                    if (root != null && attachToRoot) {
497                        root.addView(temp, params);
498                    }
499
500                    // Decide whether to return the root that was passed in or the
501                    // top view found in xml.
502                    if (root == null || !attachToRoot) {
503                        result = temp;
504                    }

从第 471 ~ 482 行,它将设置子视图的布局参数,新创建的参数与父视图匹配。

从第 496~498 行开始,父视图添加了带有布局参数的子视图。

所以区别在于是否将布局参数设置为子视图

于 2013-07-17T02:25:15.187 回答