19

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

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

4 回答 4

7

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

的文档addToBackStack非常清楚:

此返回堆栈状态的可选名称,或 null。

而对于replace

片段的可选标签名称,稍后使用 FragmentManager.findFragmentByTag(String) 检索片段。

所以这两个参数是独立的,一个标识back stack,另一个标识里面的fragment Activity's FragmentManager

从这个角度来看,您的代码似乎是正确的,只是我不会fragmentContainer通过它的 id 搜索视图,而只是使用它的 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();
}

如果您以后不需要识别此返回堆栈,请将 null 传递给addToBackStack. 至少我一直在这样做。

于 2013-09-17T09:39:34.740 回答
6

在此示例中,您不需要添加标签作为标识。做就是了:

ft.replace(R.id.fragment_container,fragmentB);
ft.addToBackStack(null);
ft.commit();

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

于 2013-01-22T14:10:53.087 回答
4

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

    .addToBackStack(null);

但是将 TAG 传递给 addToBackStack 有助于通过 TAG 识别 Fragment 堆栈中的片段。喜欢

.addToBackStack(FragmentName.TAG);

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

 getFragmentManager().findFragmentByTag(SettingsFragment.TAG);

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

于 2017-11-03T11:28:48.517 回答
2

传递给的参数addToBackStack()可用于检索整个 BackStackEntry 对象,而不仅仅是单个片段。为了设置片段标签,请考虑使用 3 参数版本的 add(int, Fragment, String) 和 replace(int, Fragment, String)

在添加片段之前,您将能够使用以下命令检查该片段是否已经在后台堆栈中:

 getFragmentMangager().findFragmentByTag(SettingsFragment.TAG);

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

于 2014-06-27T06:31:19.940 回答