37

我刚刚浏览了以下方法attach()的文档:detach()FragmentTransaction

attach():在片段之前使用 . 与 UI 分离后重新附加片段detach(Fragment)。这会导致其视图层次结构被重新创建、附加到 UI 并显示。

嗯,那是什么意思?

  1. 更具体地说,我看到了一个例子:

    mMapFragment = new MapFragment();
    ft.beginTransaction(mMapFragment)
      .attach()
      .add(R.id.container, mMapFragment)
      .commit();
    

    我删除attach()并再次尝试:我没有发现任何区别。在这个例子中做什么attach?与此相比有什么区别:

    ft.beginTransaction()
      .add(R.id.container, mMapFragment)
      .commit();
    
  2. 如果上面的示例不足以显示差异......我只想知道我们什么时候需要显式调用attach()and detach()?如果您能解释关于添加/删除/替换的区别会更好。

4

1 回答 1

99

我认为最好看一下FragmentTransaction 文档中 Detach 和 Remove 的定义,以了解发生了什么。

分离

从 UI 中分离给定的片段。这与它被放入回栈时的状态相同:片段从 UI 中移除,但其状态仍由片段管理器主动管理。当进入这种状态时,它的视图层次结构被破坏。

消除

删除现有片段。如果它被添加到容器中,它的视图也会从该容器中移除。

它的意思是:

通过分离,您只会破坏片段视图,但会将其状态保留在片段管理器中。但是,通过删除,您将从片段管理器中删除片段及其状态;此外,如果将片段视图添加到 UI 容器中,它将删除片段视图。所以它们都破坏了片段视图,但分离将片段状态保留在片段管理器中。


现在是时候看看附加和添加了。

添加

将片段添加到活动状态。该片段还可以选择将其视图(如果 Fragment.onCreateView 返回非 null)放入活动的容器视图中。

在之前使用 detach(Fragment) 从 UI 中分离片段后,重新附加片段。这会导致其视图层次结构被重新创建、附加到 UI 并显示。

它的意思是:

添加 Fragment 后,它将被添加到活动状态,并且其视图将添加到定义的容器视图中。但是,如果片段尚未添加到 UI,则不会显示任何内容。它只是附加到片段管理器。但是,如果视图已经添加到 UI 中的容器并在此之后分离,则通过附加它将再次显示在其容器中。最后,如果您想暂时销毁片段视图并希望在未来显示和构建其视图而不丢失其在活动中的状态,则可以使用附加和分离。

于 2013-09-24T10:25:21.933 回答