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

时间:2013-12-19 12:50:49

标签: android android-fragments fragment

我所知道的是:

fragmentTransaction.replace()之后,将调用当前片段的onStop()函数 虽然fragmentTransaction.add()不会。

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

那么fragmentTransaction.replace做了什么?

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

如果前一个片段被当前片段“替换”,我想先前的片段被移除并添加当前片段,当popBackStack()调用时,它如何返回到前一片段?< / p>

2 个答案:

答案 0 :(得分:49)

您可以将多个片段添加到容器中,然后将它们分层叠放在另一个容器之上。如果您的片段具有透明背景,您将看到此效果,并且能够同时与多个片段进行交互。

如果在容器上使用FragmentTransaction.add,会发生这种情况。您添加的片段将放在现有片段的顶部。

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

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

如果您将事务添加到后台堆栈,您仍然可以返回先前的配置。即使先前的操作删除了片段,也可以执行此操作。删除的片段会在事务中被记住,然后弹出后备栈会将其恢复。

答案 1 :(得分:9)

两个选择

我们假设你有一个片段容器 而且,您的任务是将一个片段添加到容器中。

  

您可以通过调用以下任何方法来执行此操作

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

但两种方法的行为都不同!!!

enter image description here 虽然两种方法都会将您的片段添加到片段容器中,但它们的内部(内部工作)会根据片段容器的两个可能的状态而有所不同。
碎片容器时 1)其中没有任何碎片。
2)已经附加了一个或多个片段。

让我们看看当我们调用add()和replace()方法时会发生什么。

案例1:当容器中没有附加碎片时

在这种情况下,两种方法都会将片段添加到容器中。因此,他们将产生相同的效果

案例2:当fragmentContainer已经有片段/片段

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

示例
因此,假设片段容器具有片段[A-> B-> C] 现在您要添加一个新片段D.
add()方法结果将是[A-> B-> C-> D] replace()方法结果将为[D]

相关链接:

检查此Demo project以便更好地理解