调用这些方法的主要区别是什么:
fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);
替换已经存在的片段,将片段添加到活动状态,并将活动添加到后堆栈,这意味着什么?
其次,使用findFragmentByTag()
,此搜索是通过add()
/replace()
方法还是通过addToBackStack()
方法添加的标记?
示例一个活动有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
样本项目
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中膨胀的,也可以是添加到事务中时提供的。
参考文献:碎片交易
add
和替换
之间的一个更重要的区别是:
replace
删除现有片段并添加新片段。这意味着当您按下后退按钮时,被替换的片段将被创建,其onCreateView
将被调用。然而,add
保留现有片段并添加新片段,这意味着现有片段将处于活动状态,并且不会处于“暂停”状态,因此当按下后退按钮时,不会为现有片段调用创建视图(添加新片段之前的片段)。
就片段的生命周期事件而言,onPause
,onResume
,onCreateView
和其他生命周期事件将在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语句的函数,该