第一种方法:
LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, parent, true);
第二种方法:
LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, null, false);
parent.addView(child);
有什么区别吗?
第一种方法:
LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, parent, true);
第二种方法:
LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, null, false);
parent.addView(child);
有什么区别吗?
如果您检查 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 但它不会被附加,所以它只是单独的视图。
根据 Android 开发者文档:
View child = LayoutInflator.inflate(context, parent, true);
将孩子添加到父母,
View child = LayoutInflator.inflate(context, null, false);
将不会。
您可以查看参考:android.view.ViewGroup.inflate
不同之处在于您的第二个参数,它基本上告诉 Android 哪个 View 是您正在充气的那个 View 的父 View。
在第一种情况下,视图将被膨胀到作为“父”实例的 ViewGroup 中。在第二种情况下,新创建的 View 没有父级,将按原样膨胀。
是,有一点不同。
if True
:膨胀的层次结构是否应该附加到根参数?
if False
:如果为 false,则 root 仅用于为LayoutParams
XML 中的根视图创建正确的子类。
当我们不想使用 Adapter 类在 Listview 中添加行时,通常使用此参数,我们希望逐个视图或布局制作它们具有子视图的情况,在这种情况下我们使用它。
假设您调用context
了资源 id 来膨胀,这很令人困惑。有以下区别:
从布局资源顶层使用布局参数,因为parent
布局参数。在第二种情况下,不会应用这些布局参数;
从源代码如下:
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 行开始,父视图添加了带有布局参数的子视图。
所以区别在于是否将布局参数设置为子视图