首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LayoutInflater attachToRoot参数是什么意思?

LayoutInflater attachToRoot参数是什么意思?
EN

Stack Overflow用户
提问于 2012-09-24 22:55:06
回答 12查看 69.2K关注 0票数 245

对于attachToRoot参数的用途,我在LayoutInflater.inflate文档中并不是很清楚。

attachToRoot:是否应该将膨胀的层次结构附加到根参数?如果为false,则root仅用于为XML中的根视图创建正确的LayoutParams子类。

有没有人可以更详细地解释一下根视图是什么,或许可以给出一个truefalse值之间行为变化的例子?

EN

回答 12

Stack Overflow用户

发布于 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。但是我还没有测试过它。

票数 219
EN

Stack Overflow用户

发布于 2012-09-24 22:58:55

如果设置为true,则当您的布局膨胀时,它将作为子级自动添加到第二个参数中指定的ViewGroup的视图层次结构中。例如,如果根参数是一个LinearLayout,那么您的膨胀视图将自动添加为该视图的子视图。

如果设置为false,那么您的布局将被放大,但不会附加到任何其他布局(因此它将不会被绘制,接收触摸事件等)。

票数 98
EN

Stack Overflow用户

发布于 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);

来指定它将成为它自己的根。

票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12567578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档