add(),replace()和addToBackStack()之间的区别

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

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

这是什么意思replace一个已经存在的片段,并添加一个片段的活动状态,并添加一个活动到后面的堆栈?

其次,使用findFragmentByTag() ,是否通过add() / replace()方法或addToBackStack()方法add()标签?

1) fragmentTransaction.addToBackStack(str);

说明 – 将此事务添加到后退堆栈。 这意味着事务在被执行后将被记住,并且在稍后popup堆栈时将会颠倒其操作。

2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

说明 – replace已添加到容器的现有片段。 这与为所有当前添加的片段调用remove(Fragment)相同的containerViewId,然后使用这里给出的相同参数添加(int,Fragment,String)相同。

3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)

描述 – 添加一个片段到活动状态。 这个片段也可以有select地将其视图(如果Fragment.onCreateView返回非null)放入活动的容器视图中。

这是什么意思replace已经存在的片段,并添加一个片段的活动状态,并添加一个活动到后退堆栈?

有一个堆栈,其中运行状态下的所有活动都保存在其中。 碎片属于活动。 所以你可以添加它们以将它们embedded到一个活动中。

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

当你导航到当前的布局,你有该容器的ID来replace你想要的片段。

您也可以使用popBackStack()方法返回到backStack中的前一个片段。 为此,您需要使用addToBackStack()将该片段添加到堆栈中,然后使用commit()来反映。 这与目前的情况相反。

findFragmentByTag是否通过add / replace方法或addToBackStack方法来添加标签?

如果取决于你如何添加标签。 然后,它只是通过在从XML充值或在事务中添加时提供的标记find一个片段。

参考文献: FragmentTransaction

addreplace之间的另一个重要区别是: replace删除现有的片段,并添加一个新的片段。 这意味着当你按下返回button时,将被调用的onCreateView创build被replace的片段。 而add保留现有的片段,并添加一个新的片段,这意味着现有的片段将被激活,他们不会处于“已暂停”状态,因此,当按下后退buttononCreateView不会调用现有的片段(在新的片段片段被添加)。 在片段的生命周期事件onPause,onResume,onCreateView和其他生命周期事件将被调用的情况下replace但他们不会被调用的情况下add

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

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

  • add()用于简单地将片段添加到某个根元素。
  • replace()行为类似,但是首先删除前一个片段,然后添加下一个片段。

addToBackStack()add()replace()一起使用时,我们可以看到确切的差异。

add() …的情况下,当我们按回button时,onCreateView永远不会被调用。 但在replace()情况下,当我们按回button… oncreateView每次被调用。