addToBackStack(null)中null的目的是什么?

时间:2014-09-13 09:22:14

标签: java android android-layout android-fragments

我是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做什么?

(抱歉我的英语不好。)

3 个答案:

答案 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%肯定。