Android FragmentTransaction.addToBackStack混淆

Android FragmentTransaction.addToBackStack混淆,android,android-fragments,fragmenttransaction,Android,Android Fragments,Fragmenttransaction,我在研究片段,在区分FragmentTransaction.replace(id,fragment,tag)和FragmentTransaction.addToBackStack(tag)调用时有点困惑。假设我当前的片段是片段A,然后我加载了片段B。我希望在将来,当我需要加载碎片A时,我不必重新加载它。只需在旧状态下加载旧的。我使用了以下代码段: public void loadFragment(Fragment fragmentB, String tag) { FragmentMana

我在研究片段,在区分
FragmentTransaction.replace(id,fragment,tag)
FragmentTransaction.addToBackStack(tag)
调用时有点困惑。假设我当前的片段是片段A,然后我加载了片段B。我希望在将来,当我需要加载碎片A时,我不必重新加载它。只需在旧状态下加载旧的。我使用了以下代码段:

public void loadFragment(Fragment fragmentB, String tag) {
    FragmentManager fm = getSupportFragmentManager();
    View fragmentContainer = findViewById(R.id.fragment_container);

    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(fragmentContainer.getId(), fragmentB, tag);

    ft.addToBackStack(tag);

    ft.commit();
}

现在我很困惑,我应该在哪里添加字符串标记?在
replace()
addToBackStack()
中,还是在两个调用中?您能解释一下这两个标记位置之间的区别吗?

在本例中,您不需要添加标记作为标识。 只要做:

当您想要添加没有UI的片段时,通常使用标记作为标识

你能解释一下这两个标签的区别吗

的文档非常清楚:

此后台堆栈状态的可选名称,或null

而对于:

片段的可选标记名,以便稍后检索片段 使用FragmentManager.findFragmentByTag(字符串)

因此,这两个参数是独立的,一个标识后台堆栈,而另一个标识
活动的FragmentManager
中的片段

从这个角度来看,您的代码似乎是正确的,只是我不会按其id搜索
fragmentContainer
视图,而是使用其id替换片段。让它更简单:

public void loadFragment(Fragment fragmentB, String tag) {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fragment_container, fragmentB, tag);

    ft.addToBackStack(null);

    ft.commit();
}

如果您以后不需要识别此后台堆栈,请为
addToBackStack
传递null。至少我一直在这么做。

传递给
addToBackStack()
的参数可以用来检索整个BackStackEntry对象,而不仅仅是单个片段。为了设置片段标签,考虑使用3PARAM版本的Adter(int,String,String)和替换(int,片段,string)

在添加片段之前,您将能够使用以下方法检查此片段是否已在backstack中:

 getFragmentMangager().findFragmentByTag(SettingsFragment.TAG);

如果尚未添加
片段
,则返回
null

将null传递给addtoBackStack(null)意味着在片段堆栈中添加片段,但不添加任何标记,在再次添加之前,这些标记可进一步用于标识堆栈中的特定片段

    .addToBackStack(null);
但将标记传递给addToBackStack有助于逐个标记地识别片段堆栈中的片段。 像

现在,我们可以在将片段添加到堆栈之前检查片段:

 getFragmentManager().findFragmentByTag(SettingsFragment.TAG);

如果尚未添加片段,则返回null。

但将来如果我已将多个片段添加到堆栈中,并希望加载特定片段,那么该怎么办?传递片段
标记
,以便在将其添加到BackStack时能够识别片段:
.addToBackStack(YourFragment.TAG)
这样您就可以使用以下命令检查片段是否已经在BackStack中:
getFragmentManager().findfFragmentByTag(YourFragment.TAG)ft.addToBackStack(空);这行代码的目的是什么?显示addToBackStack(null)将确保事务也保存到backstack。或者,您可以使用此backback状态的名称。什么是“此backback状态的名称”?我的意思是,“倒退状态”的目的是什么?
.addToBackStack(FragmentName.TAG);
 getFragmentManager().findFragmentByTag(SettingsFragment.TAG);