参数为null的addToBackStack是什么意思?


92

我有一个客户代码。所有片段只有一个活动,即单个活动正在管理所有片段。

此活动在该片段的方法末尾包含任何片段的以下代码,

例如-片段MoreFragment:

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

所以,

1)addToBackStack(null)后面跟a 是什么意思commit()

2)为什么需要将null参数传递给addToBackStack

3)这样添加后如何获得该片段?

好像这段代码没有用,因为我在没有最后一行的情况下运行了代码.addToBackStack(null).commit(),并且没有任何问题。


在某些情况下,您必须调用developer.android.com/reference/android/app/…
路西法2014年


3
您可以将片段名称作为参数传递给addToBackStack(name)而不是Null。如果传递Null,则将无法使用FragmentManager.popBackStackImmediate(String name,int flags);方法。或popBackStack(String name,int flags); 因为名称是Null。因此popBackstack方法将不起作用。我建议您将片段名称作为参数传递,而不要传递null。
luckylukein

Answers:


109

addToBackStack(null)后跟commit()是什么意思?

引用文档:

通过调用addToBackStack(),替换事务将保存到后退堆栈中,因此用户可以撤消该事务并通过按“后退”按钮恢复上一个片段。

如果您对事务添加了多个更改(例如另一个add()或remove())并调用addToBackStack(),则在调用commit()之前应用的所有更改都将作为单个事务和“返回”按钮添加到后台堆栈中。将它们全部反向。

向FragmentTransaction添加更改的顺序无关紧要,除了:

您必须打commit()最后一个电话。如果要将多个片段添加到同一容器,则添加片段的顺序将决定它们在视图层次结构中的显示顺序。

因此,您必须最后提交。

为什么需要将null参数传递给addToBackStack?

它不必为null,可以为字符串。如果您不想要,只需传递null。

公共抽象FragmentTransaction addToBackStack(字符串名称)

在API级别11中添加。将此事务添加到后台堆栈。这意味着该事务在提交后将被记住,并且在稍后从堆栈中弹出时将撤消其操作。

参数名称此反向堆栈状态的可选名称,或者为null。

关于:

似乎这段代码没有用,因为我没有最后一行就运行代码.addToBackStack(null).commit()并且它运行没有任何问题

如果要导航到上一个片段,请将其添加到后堆栈。因此,这取决于您是否要将片段添加到后堆栈。

这样添加后如何获得该片段?

您已经有片段实例firstFragment。所以我不知道稍后再获取片段意味着什么。

更多信息 @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)


您还可以通过API文档将其添加到您的答案中:将事务添加到后台堆栈。这意味着该事务在提交后将被记住,并且在稍后从堆栈中弹出时将撤消其操作。参数名称此反向堆栈状态的可选名称,或者为null。
Dyrborg 2014年

因此,据我所知,添加到backstack的整个目的是执行导航,就像我们使用后退按钮转到上一个片段一样?
我的上帝

好的,所以如果您要向addToBackStack传递参数,那么为什么getFragmentManager().popBackStackImmediate()后退按钮可以通过/不通过参数传递单独完成它,为什么我们需要这样做?见的答案- stackoverflow.com/questions/21156153/...
我的天

@VedPrakash你不需要。这也是一个完全不同的问题和答案。您可以通过将两个片段添加到堆栈中并按下“ back”按钮来轻松地发现自己
Raghunandan 2014年


16

中的tag字符串addToBackStack(String name)提供了一种定位后堆栈的方法,以便以后直接弹出到该位置。它打算在该方法中使用popToBackStack(String name, int flags)

从管理器的片段回栈中弹出最后一个片段过渡。此函数是异步的-使请求弹出,但该操作将在应用程序返回其事件循环之前执行。

name:如果非null,则为要查找的前一个返回状态的名称;如果找到,将弹出该状态之前的所有状态。POP_BACK_STACK_INCLUSIVE标志可用于控制是否弹出指定状态。如果为null,则仅弹出最高状态。

标志:0或POP_BACK_STACK_INCLUSIVE。

换句话说,它将弹出您的后栈,直到找到由namein 添加的片段。addToBackStack(String name)

例如,如果您对片段管理器进行了一系列添加或替换,并给出了名称“ frag1”,“ frag2”,“ frag3”,“ frag4”,后来又想直接回到使用addToBackStack(“ frag2“),您致电popToBackStack("frag2", 0)

所以,

  • .addToBackStack("fragName")如果您以后popToBackStack(String name, int flags)想要弹出多个后退堆栈,请使用:。

  • 使用.addToBackStack(null):如果您不希望以后弹出多个后退堆栈,但仍然想一次弹出一个。即使您不会显式调用popToBackStack(),也要执行此操作,而是让后按默认实现处理后退堆栈。

  • 使用.disallowAddToBackStack():如果您不希望后按或显式调用popBackStack()。它将确保代码的任何部分都没有使用.addToBackStack()。


1

您的答案已过时。如果您不想将片段添加到堆栈中,则应使用以下代码片段:

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

下面有一个可爱的使用示例:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);

6
在哪里弃用?我在文档或FragmentTransaction源文件中看不到任何内容。
Rup

3
当心,如果您disallowAddToBackStack,则 将来对addToBackStack的任何调用都将抛出IllegalStateException。如果已经调用addToBackStack,则此方法将引发IllegalStateException。
卡希尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.