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

Posted

技术标签:

【中文标题】fragmentTransaction.add 和 fragmentTransaction.replace 之间的区别【英文标题】:difference between fragmentTransaction.add and fragmentTransaction.replace 【发布时间】:2014-01-08 01:17:53 【问题描述】:

我已经知道的是:

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

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

那么fragmentTransaction.replace做了什么?

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

如果之前的片段被当前片段“替换”,我猜之前的片段被删除并添加了当前片段,当popBackStack()调用时如何返回到之前的片段?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

在这种情况下会始终创建片段还是使用它的现有实例?例如:我们有 Fragment_1、Fragment_2、Fragment_3,我们按以下顺序多次调用 transaction.replace(container, Fragment_X):1、2、3、1、3、2、1 等... Fragment_1 的所有出现都会是每当我们在 transaction.replace(...) 中使用它们时,它们都会重新创建相同或全部吗? 10q 如果您按照 1、2、3、1、3、2、1 的顺序执行此操作replace(R.id.container, new Fragment1())。然后创建了 7 个片段,它们是不同的实例。由于您使用“replace”而不是“add”,因此只有一个片段(第三个 Fragment1)会在内存中,而其他片段将被销毁。然后当您弹出片段堆栈时,系统将重新创建您的第二个 Fragment2(带有参数和 Fragment2 的 savedInstanceStates)。【参考方案2】:

两种选择

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

您可以通过调用以下任何方法来做到这一点

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

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

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

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

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

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

案例2:当fragmentContainer已经有fragment/fragments时

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

示例 所以假设 Fragment 容器有fragments[A->B->C]。 现在您要添加一个新的fragment Dadd() 方法结果将为[A->B->C->D]replace() 方法结果将为[D]

相关链接:

查看此Demo project 以获得更好的理解。

【讨论】:

那么你的意思是当 Fragment D 被“添加”时,如果 Fragment D 有透明背景,点击 Fragment D 会将触摸传播到后面的 Fragment?

以上是关于fragmentTransaction.add 和 fragmentTransaction.replace 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

共享元素过渡适用于 FragmentTransaction.replace() 但不适用于 FragmentTransaction.add()

当我使用 fragmentTransaction.add 方法时片段重叠

android如何为片段按钮设置OnClickListener

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]