对于attachToRoot
参数的用途,我在LayoutInflater.inflate
文档中并不是很清楚。
attachToRoot:是否应该将膨胀的层次结构附加到根参数?如果为false,则root仅用于为XML中的根视图创建正确的LayoutParams子类。
有没有人可以更详细地解释一下根视图是什么,或许可以给出一个true
和false
值之间行为变化的例子?
发布于 2017-08-22 13:49:45
现在或不是现在
“第三个”参数attachToRoot是真还是假之间的主要区别在于。
当您将attachToRoot设置为
true :立即将子视图添加到父
false:将子视图添加到父,而不是现在的。
稍后再添加。`
是什么时候更新的?
后面就是你使用for例如parent.addView(childView)
的时候。
一个常见的误解是,如果attachToRoot参数为false,那么子视图将不会被添加到父视图中。错误的
在这两种情况下,子视图都将添加到parentView中。这只是time的问题。
inflater.inflate(child,parent,false);
parent.addView(child);
等同于
inflater.inflate(child,parent,true);
是一个大禁忌
如果您不负责将子视图添加到父视图中,则不应将attachToRoot作为true传递。
例如添加分片时
public View onCreateView(LayoutInflater inflater,ViewGroup parent,Bundle bundle)
{
super.onCreateView(inflater,parent,bundle);
View view = inflater.inflate(R.layout.image_fragment,parent,false);
.....
return view;
}
如果你将第三个参数作为true传递,你会因为这个家伙而得到IllegalStateException。
getSupportFragmentManager()
.beginTransaction()
.add(parent, childFragment)
.commit();
因为您已经错误地在onCreateView()中添加子片段。调用add会告诉您,子视图已添加到父视图中,因此为IllegalStateException.
这里你不负责添加childView,FragmentManager负责。所以在这种情况下总是传递false。
注意:我也读到过,如果attachToRoot为false,parentView将不会获得childView touchEvents。但是我还没有测试过它。
发布于 2012-09-24 22:58:55
如果设置为true,则当您的布局膨胀时,它将作为子级自动添加到第二个参数中指定的ViewGroup的视图层次结构中。例如,如果根参数是一个LinearLayout
,那么您的膨胀视图将自动添加为该视图的子视图。
如果设置为false,那么您的布局将被放大,但不会附加到任何其他布局(因此它将不会被绘制,接收触摸事件等)。
发布于 2014-01-08 03:12:19
在回复中似乎有很多文本,但没有代码,这就是为什么我决定用一个代码示例来重新提出这个老问题,在人们提到的几个回复中:
如果设置为true,则当您的布局膨胀时,它将作为子级自动添加到第二个参数中指定的ViewGroup的视图层次结构中。
这在代码中的实际含义(大多数程序员都理解的)是:
public class MyCustomLayout extends LinearLayout {
public MyCustomLayout(Context context) {
super(context);
// Inflate the view from the layout resource and pass it as child of mine (Notice I'm a LinearLayout class).
LayoutInflater.from(context).inflate(R.layout.child_view, this, true);
}
}
请注意,前面的代码将布局参数添加为MyCustomLayout
的子级,因为attachToRoot
参数为true
,并以完全相同的方式分配父级的布局参数,就像我以编程方式使用addView
一样,或者像我在xml中这样做:
<查看... />...
以下代码解释了将attachRoot
作为false
传递时的场景
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
linearLayout.setOrientation(LinearLayout.VERTICAL);
// Create a stand-alone view
View myView = LayoutInflater.from(context)
.inflate(R.layout.ownRootView, null, false);
linearLayout.addView(myView);
在前面的代码中,您指定希望myView
成为它自己的根对象,并且不将其附加到任何父对象,后来我们将其添加为LinearLayout
的一部分,但在一段时间内,它是一个独立(无父)视图。
同样的事情也发生在片段上,你可以将它们添加到已经存在的组中,并成为其中的一部分,或者只是传递参数:
inflater.inflate(R.layout.fragment,null,false);
来指定它将成为它自己的根。
https://stackoverflow.com/questions/12567578
复制相似问题