addToBackStack(null)中的null有什么作用?

12

我刚开始学习Android开发,我创建了一个用于程序化替换片段的代码片段。

我遵循了Android开发者指南

我创建了一个名为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,我们可以使用类似于这样的内容

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

(抱歉我的英语不好。)


@nem 我知道 Java 中的 null 是什么,但我想知道 addToBackStack() 中的 null 是为什么?这个方法中的 null 的目的是什么? - xyz
3个回答

18

根据文档,很清楚:

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
请使用@user3760100检查片段是否已经显示旧数据,并使用新数据重新创建它? - Karan Harsh Wardhan
我尝试测试您的示例并发现名称用于在弹出事务时管理后退堆栈,通过public abstract void popBackStack (String name, int flags) - Alex Felipe

8
请注意,addToBackStack(name) 中使用的“name”无法用于通过调用 fragmentManager.findFragmentByTag(tag) 检索片段。 "tag"与"name"是不同的。

在 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。没有名称,您将无法这样做。


1

我认为,如果你试图弹出后退堆栈,就不应该使用.addToBackStack(null); 因为有可能会抛出java.lang.IllegalStateException,因为它将无法引用最后添加的弹出项。这需要进行检查... 我不确定是否百分之百正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接