何时使用FragmentTransaction的attach和detach方法

37

我刚刚查看了 FragmentTransactionattach()detach() 方法的文档:

attach(): 在使用detach(Fragment)方法将片段从UI中移除之后重新附加一个片段。这将导致其视图层次结构被重新创建,附加到UI并显示。

那么,这意味着什么?

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

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

    我删除了attach()并再次尝试:我没有注意到任何区别。在这个例子中,attach是什么作用?与此相比有什么不同:

    我删掉了attach()方法后重新尝试,但没有发现任何区别。请问在这个例子中,attach方法的作用是什么?与之前相比有什么不同?

    ft.beginTransaction()
      .add(R.id.container, mMapFragment)
      .commit();
    
  3. 如果上面的示例不足以显示差异... 我只是想知道我们何时需要显式调用attach()detach()?如果您可以解释与添加/删除/替换相关的差异会更好。


你遇到了什么样的错误? - saravanan
个人而言,我使用“attach once”,如果需要更新,则调用“replace”。 - Tobrun
嗨,这个例子运行没有错误。我只是想知道为什么这个例子调用了attach(),以及其他什么情况下需要调用attach。我感到困惑,因为似乎replace、add、remove可以完成所有操作,那么attach和detach的意义是什么? - GingerJim
1个回答

103

我认为最好先查看FragmentTransaction文档中关于Detach和Remove的定义,以便理解正在发生的事情。

Detach

将给定的Fragment从UI上分离。这与将其放入后退栈时相同:Fragment已从UI中移除,但其状态仍由Fragment管理器积极地管理。当进入此状态时,它的视图层次结构被销毁。

Remove

移除现有的Fragment。如果它已添加到一个容器中,则其视图也将从该容器中移除。

这意味着:

通过detach,您只是销毁Fragment视图,但保留其状态在Fragment管理器中。但是,通过remove,您将从Fragment管理器中删除Fragment及其状态;另外,如果将其添加到UI容器中,则还将删除Fragment视图。 因此,两者都会销毁Fragment视图,但是detach会将Fragment状态保留在Fragment管理器中。


现在是时候了解attach和add了。

Add

将Fragment添加到Activity状态。此Fragment可以选择性地将其视图(如果Fragment.onCreateView返回非空)添加到Activity的容器视图中。

Attach

在之前使用detach(Fragment)将其与UI分离后,重新附加Fragment。这会导致重建其视图层次结构,将其附加到UI并显示。

这意味着:

添加Fragment后,它将被添加到Activity状态,并且其视图将被添加到定义的容器视图中。

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


3
我知道你写这段话已经一段时间了,但是感谢上帝有你的解释! - Stelios Papamichail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接