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

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

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

其次,使用findFragmentByTag(),是否搜索由add()/replace()方法或addToBackStack()方法添加的标记?


当前回答

需要注意的重要事项:

Replace和backstack Replace之间的区别是,当我们只使用Replace时,片段就会被销毁(ondestroy()被调用),而当我们使用backstack时,片段ondestroy()不会被调用(即当返回按钮被按下时,片段会被其onCreateView()调用)

其他回答

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

使用替换

去Fragment1

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

去Fragment2

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

流行Fragment2

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

流行Fragment1

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

使用添加

去Fragment1

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

去Fragment2

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

流行Fragment2

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

流行Fragment1

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

示例项目

1) fragmentTransaction.addToBackStack(str);

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

2) fragmentTransaction。替换(int containerViewId, Fragment片段,String标签)

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

3) fragmentTransaction。add(int containerViewId, Fragment片段,String标签)

描述-为活动状态添加一个片段。这个片段也可以有它的视图(如果片段。onCreateView返回非空)到活动的容器视图中。

替换已经存在的片段和添加是什么意思 一个活动状态的片段,并将一个活动添加到后面 栈?

有一个堆栈,所有处于运行状态的活动都保存在其中。片段属于活动。所以你可以添加它们来嵌入到一个活动中。

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

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

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

findFragmentByTag搜索由add/replace添加的标签 方法或addToBackStack方法?

If取决于您如何添加标签。然后,它仅通过您之前定义的标记(在从XML膨胀时或在添加到事务时提供的标记)找到一个片段。

引用:FragmentTransaction

add()和replace()之间的基本区别可以描述为:

Add()用于简单地向某个根元素添加片段。 Replace()的行为类似,但首先它删除之前的片段,然后添加下一个片段。

当我们将addToBackStack()与add()或replace()一起使用时,我们可以看到确切的区别。

当我们按下返回按钮后,如果add()…onCreateView从未被调用,但在replace()的情况下,当我们按下返回按钮…每次都调用oncreateView。

FragmentManger的添加和替换功能可以这样描述 1. 添加意味着它会将片段添加到片段返回堆栈中,并在您提供的给定帧中显示 就像

getFragmentManager.beginTransaction.add(R.id.contentframe,Fragment1.newInstance(),null)

2.替换意味着你在给定的帧中用另一个片段替换这个片段

getFragmentManager.beginTransaction.replace(R.id.contentframe,Fragment1.newInstance(),null)

两者之间的主要实用程序是,当你回堆叠时,replace将刷新片段,而add将不会刷新之前的片段。

需要注意的重要事项:

Replace和backstack Replace之间的区别是,当我们只使用Replace时,片段就会被销毁(ondestroy()被调用),而当我们使用backstack时,片段ondestroy()不会被调用(即当返回按钮被按下时,片段会被其onCreateView()调用)