Android FragmentTransaction.addToBackStack 混淆

19

我正在学习Fragments,对于不同调用 FragmentTransaction.replace(id, fragment, tag)FragmentTransaction.addToBackStack(tag) 之间的区别感到有些困惑。假设我的当前fragment是 FragmentA ,然后我加载了 FragmentB 。 我希望在将来需要加载 FragmentA 时,无需重新加载它,只需加载旧状态中的旧fragment。我使用了以下代码段:

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()里或者两个调用中都添加?你能解释一下这两个标签位置之间的区别吗?

4个回答

7
你能解释一下这两个标记位置的区别吗? addToBackStack的文档说明相当清晰:
一个可选的名称用于此返回堆栈状态,或者为null。
而对于replace
可选的标记名称,用于稍后使用FragmentManager.findFragmentByTag(String)检索该片段。
因此,这两个参数是独立的,一个标识返回堆栈,另一个标识Activity's 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。至少我一直这样做。

6
在这个例子中,您不需要添加标记来进行识别。 只需执行以下操作即可:
ft.replace(R.id.fragment_container,fragmentB);
ft.addToBackStack(null);
ft.commit();

当您想添加一个没有UI的片段时,通常会使用标签作为标识。


2
但是如果我将多个片段添加到堆栈中,并且想要加载特定的片段,该怎么办? - Khawar Raza
5
将一个片段 TAG 传递以便在将其添加到返回栈时能够识别该片段: .addToBackStack(YourFragment.TAG);这样,您可以使用以下方式检查 Fragment 是否已经存在于返回栈中: getFragmentManager().findFragmentByTag(YourFragment.TAG); - Mazen Kasser
1
这行代码的目的是什么?ft.addToBackStack(null); - Duna
2
http://developer.android.com/guide/components/fragments.html 显示我们,addToBackStack(null)将确保事务也保存到后退栈中。可选地,您可以为此后退栈状态使用名称。 - K Roobroeck
2
“a name for this backstack state” 是什么意思?我的意思是,“backstack state”的目的是什么? - Everett

4
将 null 传递给 addtoBackStack(null) 表示将片段添加到片段堆栈中,但不添加任何标签,这些标签可以在再次添加之前用于识别堆栈中的特定片段。请保留 HTML 标记。
    .addToBackStack(null);

但是,将TAG传递给addToBackStack有助于通过TAG在Fragment堆栈中识别Fragment。 例如:
.addToBackStack(FragmentName.TAG);

现在,在将片段添加到堆栈之前,我们可以检查该片段:
 getFragmentManager().findFragmentByTag(SettingsFragment.TAG);

如果Fragment尚未添加,这将返回null。

2

addToBackStack()方法传递的参数可以用于检索整个BackStackEntry对象,而不仅仅是单个片段。如果要设置片段标记,请考虑使用add(int,Fragment,String)和replace(int,Fragment,String)的三个参数版本。

在添加片段之前,您可以使用以下方法检查此片段是否已经存在于后退栈中:

 getFragmentMangager().findFragmentByTag(SettingsFragment.TAG);

如果Fragment尚未添加,这将返回null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接