我是Andoid开发的新手,我创建了一个代码片段来替换片段。
我关注了guide on android developers。
我创建了一个名为selectFrag
的方法,然后点击按钮点击它:
public void selectFrag(View view)
{
Fragment fr;
if(view == findViewById(R.id.showsecond)) {
fr = new secondfragment();
} else {
fr = new firstfragment();
}
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragment_place,fr);
ft.addToBackStack(null);
ft.commit();
}
代码完美无缺,我理解除addToBackStack(null)
之外的所有内容。
我试验并理解这个方法是将片段添加到后退按钮的堆栈中,这样如果我们点击后退按钮,它就不会离开屏幕并显示之前的工作。
但是,我不明白null
在这里显示的内容。我在网上搜索但我只知道它是TAG
,我们可以使用something like this。
所以,我的问题非常简单:这里null
是什么意思?或null
做什么?
(抱歉我的英语不好。)
答案 0 :(得分:15)
从documentation开始,非常清楚:
public abstract FragmentTransaction addToBackStack (String name)
将此事务添加到后台堆栈。这意味着事务将在提交后被记住,并在稍后从堆栈中弹出时将反转其操作。
参数
name // An optional name for this back stack state, or null.
因此,您的参数是可选,并代表片段的名称。
如果您只想将此交易添加到后台并且以后不需要访问它,那么您可以将null
作为名称。
在这种情况下,null
用简单的英语表示"我不需要这个片段的名称"。这就是为什么它说这个名字是可选的。如果您输入了名称,则可以稍后使用该名称。如果你设置null
只是意味着"将这个片段添加到后面的堆栈中我再也不需要它了#34;。
使用该名称是为了识别该特定片段。例如,如果您想从FragmentManager
:
addToBackStack (FRAGMENT_NAME);
getFragmentMangager().findFragmentByTag(FRAGMENT_NAME);
答案 1 :(得分:5)
只是想澄清一点,addToBackStack(name)中使用的'name'不能用于通过调用fragmentManager.findFragmentByTag(tag)来检索片段。 “标记”与“名称”不同。
add / replace(id,fragment,tag)中使用的'tag'用于通过调用fragmentManager.findFragmentByTag(tag)来检索片段。
但是,addToBackStatck(name)中使用的'name'用于通过调用popBackStatck / Immediate(name,flags)来控制要将片段返回堆栈弹出到哪个片段。因此,如果我有一个带有命名片段的片段堆栈:A,B,C和D,底部带有A.当你调用popBackStack(B,XXX_EXCLUSIVE)时,你的片段后端堆栈将类似于:A和B后调用。如果没有名字,你就无法做到。
答案 2 :(得分:1)
我认为你不应该使用.addToBackStack(null); 如果你试图弹出Backstack的机会是它可能会抛出 java.lang.IllegalStateException,因为它没有对弹出的有效引用添加的最后一项。这需要检查......我不是100%肯定。