首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fragmentTransaction.add与fragmentTransaction.replace的区别

fragmentTransaction.add与fragmentTransaction.replace的区别
EN

Stack Overflow用户
提问于 2013-12-19 12:50:48
回答 2查看 26.8K关注 0票数 30

我已经知道的是:

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

调用fragMgr.popBackStack();之后,无论使用fragmentTransaction.replace还是fragmentTransaction.add(),我们都将返回到以前的片段。

那么fragmentTransaction.replace 做什么呢?

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-19 13:00:27

您可以将多个片段添加到一个容器中,它们将是分层的,一个在另一个之上。如果您的片段有透明的背景,您将看到这一效果,并将能够与多个片段在同一时间互动。

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

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

您也可以在没有容器id的情况下使用add方法,您的片段将被简单地添加到FragmentManager中的片段列表中,并且您可以随时通过它们的标记值来回忆这些片段。

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

票数 56
EN

Stack Overflow用户

发布于 2017-11-28 17:38:57

两种选择

假设你有一个碎片容器。

并且,您的任务是向容器中添加一个片段。

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

1) add(containerId,fragment)

2) replace(containerId,fragment)

但这两种方法在行为上是不同的!

虽然这两种方法都会将您的片段添加到片段容器中,但是它们的内部(内部工作)根据碎片容器的两个可能的状态而有所不同。

碎片容器

( 1)没有任何片段。

( 2)已经有一个或多个片段附在上面。

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

案例1:当容器中没有任何碎片时

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

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

add():将新片段添加到另一个片段的顶部

replace():移除所有内容,然后添加新片段

示例

因此,假设片段容器有fragments[A->B->C]

现在您想要添加一个新的fragment D

add()方法的结果将是[A->B->C->D]

replace()方法的结果将是[D]

相关链接:

检查这个演示项目以获得更好的理解。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20682248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档