当前位置: 首页 > 知识库问答 >
问题:

add()、replace()和addToBackStack()之间的差异

林鹏鹍
2023-03-14

调用这些方法的主要区别是什么:

fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);

替换已经存在的片段,将片段添加到活动状态,并将活动添加到后堆栈,这意味着什么?

其次,使用findFragmentByTag(),此搜索是通过add()/replace()方法还是通过addToBackStack()方法添加的标记?

共有3个答案

璩慎之
2023-03-14

示例一个活动有2个片段,我们使用FragmentManager将每个片段替换/添加为addToBackstack活动中的布局

使用替换

分崩离析

Fragment1: onAttach
Fragment1: onCreate
Fragment1: onCreateView
Fragment1: onActivityCreated
Fragment1: onStart
Fragment1: onResume

分崩离析

Fragment2: onAttach
Fragment2: onCreate
Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment2: onCreateView
Fragment2: onActivityCreated
Fragment2: onStart
Fragment2: onResume

流行音乐片段2

Fragment2: onPause
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment2: onDetach
Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

流行音乐片段1

Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach

使用添加

分崩离析

Fragment1: onAttach
Fragment1: onCreate
Fragment1: onCreateView
Fragment1: onActivityCreated
Fragment1: onStart
Fragment1: onResume

分崩离析

Fragment2: onAttach
Fragment2: onCreate
Fragment2: onCreateView
Fragment2: onActivityCreated
Fragment2: onStart
Fragment2: onResume

流行音乐片段2

Fragment2: onPause
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment2: onDetach

流行音乐片段1

Fragment1: onPause
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach

样本项目

葛昕
2023-03-14

1) fragmentTransaction。addToBackStack(str)

描述-将此事务添加到后堆栈。这意味着事务将在提交后被记住,并在稍后从堆栈弹出时反转其操作。

2) fragmentTransaction。替换(int-containerWebID、片段、字符串标记)

描述-替换添加到容器中的现有片段。这本质上与为所有当前添加的片段调用remove(Fragment)相同,这些片段是使用相同的containerWebID添加的,然后使用此处给出的相同参数添加(int、Fragment、String)。

3)framentTransaction.add(int容器ViewId,片段,字符串标签)

Description-将片段添加到活动状态。此片段还可以选择将其视图(如果fragment.onCreateView返回非null)放入活动的容器视图中。

替换已经存在的片段、将片段添加到活动状态以及将活动添加到后堆栈意味着什么?

有一个堆栈,其中保存了处于运行状态的所有活动。片段属于活动。因此,您可以添加它们以将其嵌入到活动中。

您可以在单个活动中组合多个片段来构建多窗格UI,并在多个活动中重用片段。当您以不同的布局定义片段容器时,这基本上是有用的。您只需要在任何布局中替换任何其他片段。

当您导航到当前布局时,您拥有该容器的id,可以将其替换为所需的片段。

您还可以使用popBackStack()方法返回backStack中的上一个片段。为此,您需要使用addToBackStack()将该片段添加到堆栈中,然后使用commit()进行反射。这与电流在顶部的顺序相反。

FindFragmentByTag是否搜索由add/替换方法或addToBackStack方法添加的标记?

If取决于您添加标记的方式。然后,它只通过您之前定义的标记查找片段,这些标记可以是从XML中膨胀的,也可以是添加到事务中时提供的。

参考文献:碎片交易

华旭
2023-03-14

add替换之间的一个更重要的区别是:

replace删除现有片段并添加新片段。这意味着当您按下后退按钮时,被替换的片段将被创建,其onCreateView将被调用。然而,add保留现有片段并添加新片段,这意味着现有片段将处于活动状态,并且不会处于“暂停”状态,因此当按下后退按钮时,不会为现有片段调用创建视图(添加新片段之前的片段)。

就片段的生命周期事件而言,onPauseonResumeonCreateView和其他生命周期事件将在replace的情况下被调用,但在add的情况下不会被调用。

编辑:如果她正在使用某种事件总线库,如Greenrobot的Eventbus,并通过add重用同一个片段将片段堆叠在另一个片段之上,那么应该小心。在这种情况下,即使您遵循最佳实践,在onResume中注册事件总线并在onPause中注销,事件总线仍将在添加片段的每个实例中处于活动状态,因为add片段不会调用这些片段生命周期方法中的任何一个。因此,片段的每个活动实例中的事件总线侦听器将处理同一个事件,这可能不是您想要的。

 类似资料:
  • 除了后面使用正则表达式之外,java.lang.String的和方法有什么区别?对于简单的替换,如将替换为,有什么区别吗?

  • 的replace和add方法是如何以不同的方式工作的,在现实生活中是否存在需要这些方法用于特定目的的场景。

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?

  • 问题内容: package main 该代码可以很好地工作。但是,如果按如下所示更改方法,则会导致死循环。区别在于将替换为。为什么? 问题答案: 因为程序包检查要打印的值是否具有方法(或换句话说:是否实现接口),如果是,则将调用它以获取值的表示形式。 软件包doc中对此进行了说明: […]如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(

  • 我正在通过做微控制器项目来自学C++。我当前的项目是使用一对或Adafruit羽毛分组无线电。无线电数据包的库函数需要一个C样式的字符串(我相信),我理解它是一个char的数组。 我已经设置了一个枚举来反映接收方的各种操作,并希望将该状态发送回发送方。所以我想把枚举变成char的数组。 在搜索将枚举转换为char数组的方法时,最简单的方法(对我来说)是将枚举变量传递给带有switch语句的函数,该