Android FragmentTransaction.addToBackStack混淆
我在研究片段,在区分Android FragmentTransaction.addToBackStack混淆,android,android-fragments,fragmenttransaction,Android,Android Fragments,Fragmenttransaction,我在研究片段,在区分FragmentTransaction.replace(id,fragment,tag)和FragmentTransaction.addToBackStack(tag)调用时有点困惑。假设我当前的片段是片段A,然后我加载了片段B。我希望在将来,当我需要加载碎片A时,我不必重新加载它。只需在旧状态下加载旧的。我使用了以下代码段: public void loadFragment(Fragment fragmentB, String tag) { FragmentMana
FragmentTransaction.replace(id,fragment,tag)
和FragmentTransaction.addToBackStack(tag)
调用时有点困惑。假设我当前的片段是片段A,然后我加载了片段B。我希望在将来,当我需要加载碎片A时,我不必重新加载它。只需在旧状态下加载旧的。我使用了以下代码段:
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()
中,还是在两个调用中?您能解释一下这两个标记位置之间的区别吗?在本例中,您不需要添加标记作为标识。
只要做:
当您想要添加没有UI的片段时,通常使用标记作为标识
你能解释一下这两个标签的区别吗
的文档非常清楚:
此后台堆栈状态的可选名称,或null
而对于:
片段的可选标记名,以便稍后检索片段
使用FragmentManager.findFragmentByTag(字符串)
因此,这两个参数是独立的,一个标识后台堆栈,而另一个标识活动的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。至少我一直在这么做。传递给addToBackStack()
的参数可以用来检索整个BackStackEntry对象,而不仅仅是单个片段。为了设置片段标签,考虑使用3PARAM版本的Adter(int,String,String)和替换(int,片段,string)
在添加片段之前,您将能够使用以下方法检查此片段是否已在backstack中:
getFragmentMangager().findFragmentByTag(SettingsFragment.TAG);
如果尚未添加
片段
,则返回null
。将null传递给addtoBackStack(null)意味着在片段堆栈中添加片段,但不添加任何标记,在再次添加之前,这些标记可进一步用于标识堆栈中的特定片段
.addToBackStack(null);
但将标记传递给addToBackStack有助于逐个标记地识别片段堆栈中的片段。
像
现在,我们可以在将片段添加到堆栈之前检查片段:
getFragmentManager().findFragmentByTag(SettingsFragment.TAG);
如果尚未添加片段,则返回null。但将来如果我已将多个片段添加到堆栈中,并希望加载特定片段,那么该怎么办?传递片段
标记
,以便在将其添加到BackStack时能够识别片段:.addToBackStack(YourFragment.TAG)
这样您就可以使用以下命令检查片段是否已经在BackStack中:getFragmentManager().findfFragmentByTag(YourFragment.TAG)代码>ft.addToBackStack(空);这行代码的目的是什么?显示addToBackStack(null)将确保事务也保存到backstack。或者,您可以使用此backback状态的名称。什么是“此backback状态的名称”?我的意思是,“倒退状态”的目的是什么?
.addToBackStack(FragmentName.TAG);
getFragmentManager().findFragmentByTag(SettingsFragment.TAG);