带有null参数的addToBackStack是什么意思?

时间:2014-04-10 10:08:35

标签: android android-fragments

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

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

例如 - 片段MoreFragment:

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

所以,

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

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

3)如何在这样添加之后获取该片段?

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

3 个答案:

答案 0 :(得分:85)

  

addToBackStack(null)后跟commit()?

的含义是什么?

引用文档:

  

通过调用addToBackStack(),替换事务将保存到   返回堆栈,以便用户可以反转事务并将其恢复   按“返回”按钮可以显示上一个片段。

     

如果您向交易添加多项更改(例如另一项添加()   或者删除())并调用addToBackStack(),然后应用所有更改   在调用commit()之前将其作为单个添加到后台堆栈中   事务和后退按钮将一起反转它们。

将更改添加到FragmentTransaction的顺序并不重要,除了:

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

所以你必须在最后提交。

  

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

它不需要为null,它可以是一个字符串。如果你不想要,只需传递null。

  

public abstract FragmentTransaction addToBackStack(String name)

     

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

     

参数      name此后备堆栈状态的可选名称,或null。

关于:

  

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

如果要导航到上一个片段,请将其添加到backstack。所以这取决于你是否要将片段添加到backstack。

  

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

您已经拥有片段实例firstFragment。所以我以后不知道你的意思。

更多信息@

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

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

答案 1 :(得分:3)

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

  

从管理器的分片回栈中弹出最后一个分片过渡。该函数是异步的-它使弹出请求入队,但是直到应用程序返回其事件循环时才执行该操作。

     

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

     

标志:0或POP_BACK_STACK_INCLUSIVE。

换句话说,它将弹出您的后栈,直到在name中找到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()。

答案 2 :(得分:2)

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

    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);
相关问题