我正在研究片段,并且在区分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()
或两次通话中?你能解释这两个标签位置之间的区别吗?
答案 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。