Android FragmentTransaction.addToBackStack混淆

时间:2013-01-22 13:50:32

标签: android android-fragments fragmenttransaction

我正在研究片段,并且在区分FragmentTransaction.replace(id, fragment, tag)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 个答案:

答案 0 :(得分:6)

  

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

addToBackStack的文档很清楚:

  

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

适用于replace

  

片段的可选标记名称,以便稍后检索片段   with 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。至少我一直在做。

答案 1 :(得分:5)

在此示例中,您无需添加标记作为标识。 只是做:

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

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

答案 2 :(得分:1)

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

在添加Fragment之前,您可以使用以下命令检查此Fragment是否已经在Backstack中:

 getFragmentMangager().findFragmentByTag(SettingsFragment.TAG);

如果尚未添加null,则会返回Fragment

答案 3 :(得分:1)

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

    .addToBackStack(null);

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

.addToBackStack(FragmentName.TAG);

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

 getFragmentManager().findFragmentByTag(SettingsFragment.TAG);

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