【问题标题】:What is the purpose of null in addToBackStack(null)?addToBackStack(null) 中 null 的目的是什么?
【发布时间】:2014-09-13 09:22:14
【问题描述】:

我是 Andoid 开发的新手,我创建了一个用于以编程方式替换片段的 sn-p。

我关注了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),我什么都懂。

我实验了下,这个方法是把fragment加入到返回按钮的栈中,这样如果我们点击返回按钮,它就不会离开屏幕,而是显示之前的工作。

但是,我不明白null 在这里显示什么。我在网上搜索但我只知道它是TAG,我们可以使用something like this

所以,我的问题很简单:这里的null 是什么意思?或null 做什么?

(对不起我的英语不好。)

【问题讨论】:

  • @nem 我知道 java 中的 null 是什么,但我想知道 addToBackStack() 中为什么为 null? ""this"" 方法中 null 的目的是什么?

标签: java android android-layout android-fragments


【解决方案1】:

来自documentation,很清楚:

public abstract FragmentTransaction addToBackStack (String name)

将此事务添加到后台堆栈。这意味着事务将在提交后被记住,并在以后从堆栈中弹出时反转其操作。

参数

name // An optional name for this back stack state, or null.

所以你的参数是可选的并且代表片段的名字。

如果您只想将此事务添加到后台堆栈并且以后不需要访问它,则可以将null作为名称。

在这种情况下,null 在简单的英语中的意思是“我不需要这个片段的名字”。这就是为什么它说这个名字是可选的。如果您确实输入了名称,则可以稍后使用该名称。如果你放一个null,那只是意味着“将此片段添加到后台堆栈,我不再需要它了”。

名称的使用是为了识别特定的片段。例如,如果您想从 FragmentManager 获取该片段,这可能很有用:

addToBackStack (FRAGMENT_NAME);
getFragmentMangager().findFragmentByTag(FRAGMENT_NAME);

【讨论】:

  • 您能想到任何现实世界的场景,其中使用片段名称而不是 null 可以派上用场。到目前为止,我从未使用过 null 以外的任何东西,并且很好奇这在哪里有用。
  • @user3760100 检查片段是否已显示旧数据并使用新数据重新创建?
  • 我试过测试你的例子,我发现当public abstract void popBackStack (String name, int flags)弹出事务时,该名称用于管理后台堆栈。
【解决方案2】:

只是想澄清一下,addToBackStack(name) 中使用的“名称”不能用于通过调用 fragmentManager.findFragmentByTag(tag) 来检索片段。 “标签”与“名称”不同。

add/replace(id, fragment, tag)中使用的'tag'用于通过调用fragmentManager.findFragmentByTag(tag)来检索片段。

但是,addToBackStatck(name) 中使用的“名称”用于通过调用 popBackStatck/Immediate(name, flags) 来控制要将片段回栈弹出到哪个片段。因此,如果我有一个带有命名片段的片段堆栈:A、B、C 和 D,底部有 A。当您调用 popBackStack(B, XXX_EXCLUSIVE) 时,您的片段返回堆栈将如下所示:调用后的 A 和 B。没有名字,你不能这样做。

【讨论】:

    【解决方案3】:

    我认为你不应该使用 .addToBackStack(null); 如果你试图弹出 Backstack,它可能会抛出 java.lang.IllegalStateException 因为它不会有效引用 Popout 最后添加的项目。这需要检查...我不是 100% 确定。

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 2019-10-24
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多