fragmentTransaction.add和fragmentTransaction.replace之间的区别

我已经知道的是:

fragmentTransaction.replace() ,当前片段onStop()函数将被调用,而fragmentTransaction.add()不会。

并在调用fragMgr.popBackStack(); ,无论使用fragmentTransaction.replace还是fragmentTransaction.add() ,我们都会返回到上一个片段

那么fragmentTransaction.replace做什么的?

我可以理解,我们可以通过popBackStack()函数“添加”前一个片段的opon片段,然后返回到前一个片段,但是:

如果前一个片段被当前片段“replace” ,我猜想前一个片段被删除,并且当前片段被添加,当popBackStack()被调用时,它怎么能返回到前一个片段呢?

Solutions Collecting From Web of "fragmentTransaction.add和fragmentTransaction.replace之间的区别"

您可以将多个片段添加到容器中,并将它们分层叠放。 如果你的片段有透明的背景,你会看到这个效果,并且能够同时与多个片段交互。

这是如果您在容器上使用FragmentTransaction.add会发生什么。 您添加的片段将放置在您的现有片段的顶部。

如果使用FragmentTransaction.replace(R.id.container,fragment) ,它将删除已经在容器中的任何片段,并将新的片段添加到同一个容器中。

您也可以使用add方法而不使用容器标识符,并且您的片段将被简单地添加到FragmentManager中的片段列表中,您可以随时通过它们的Tag值来调用这些片段。

如果您将事务添加到回栈中,您仍然可以返回到以前的configuration。 即使先前的操作删除了一个片段,也可以执行此操作。 被删除的片段在事务中被记住,并且popup返回栈将其返回。

两个select

如果您的任务是将一个片段添加到FragmentContainer中,则可以通过调用以下任一方法来完成此操作

1)add(containerId,fragment)
2)replace(containerId,fragment)

但是两种方法在行为上都有所不同

案例1:当容器中没有附件时

在这种情况下,两种方法都会在容器中添加片段,所以它们会产生相同的效果

情况2:当fragmentContainer已经有片段/片段时

add() :将新的片段添加到另一个片段的顶部
replace() :删除所有内容,然后添加新的片段


所以假设片段容器有片段[A-> B-> C]。
现在你想添加一个新的片段D.
add()方法的结果是[A-> B-> C-> D]
replace()方法的结果将是[D]