Android FragmentTransaction.addToBackStack混淆

Kha*_*aza 16 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();
}
Run Code Online (Sandbox Code Playgroud)

现在我很困惑,我应该在哪里添加字符串标签?在replace()addToBackStack()或在两个电话?你能解释这两个标签位置之间的区别吗?

gun*_*nar 6

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

文档addToBackStack很清楚:

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

适用于replace:

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

所以这两个参数是独立的,一个标识后向堆栈,另一个标识内部的碎片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();
}
Run Code Online (Sandbox Code Playgroud)

如果您稍后不需要识别此后备堆栈,请为其传递null addToBackStack.至少我总是这样做.


K R*_*eck 5

在此示例中,您无需将标记添加为标识.做就是了:

ft.replace(R.id.fragment_container,fragmentB);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

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

  • 传递片段"TAG"以便能够识别片段当将其添加到BackStack时:`.addToBackStack(YourFragment.TAG);`因此,您可以使用以下命令检查片段是否已经在BackStack中:`getFragmentMangager().findFragmentByTag (YourFragment.TAG);` (5认同)
  • 但是将来如果我已经添加了多个片段到堆栈并想要加载一个特定的片段那么呢? (2认同)
  • http://developer.android.com/guide/components/fragments.html向我们展示addToBackStack(null)将确保事务也保存到backstack.(可选)您可以为此backstack状态使用名称. (2认同)
  • 什么是"这个后援状态的名称"?我的意思是,"背叛状态"的目的是什么? (2认同)