Android 带null参数的addToBackStack的含义是什么?

Android 带null参数的addToBackStack的含义是什么?,android,android-fragments,Android,Android Fragments,我有客户代码。所有片段只有一个活动,即单个活动管理所有片段 此活动包含该片段的方法端的任何片段的以下代码- 例如-fragment-MoreFragment: 所以 1) addToBackStack(null)后跟一个commit(),这是什么意思 2) 为什么需要将空参数传递给addToBackStack 3) 这样添加后,如何获得该片段 似乎这段代码没有用,因为我运行代码时没有最后一行.addToBackStack(null).commit(),而且运行时没有任何问题 addToBackS

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

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

例如-fragment-MoreFragment:

所以

1)
addToBackStack(null)
后跟一个
commit()
,这是什么意思

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

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

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

addToBackStack(null)后跟commit()的含义是什么

报价文件:

通过调用addToBackStack(),替换事务将保存到 返回堆栈,以便用户可以反转事务并返回 上一个片段,按后退按钮

如果向事务添加多个更改(例如另一个add() 或remove())并调用addToBackStack(),然后应用所有更改 在调用commit()之前,将其作为单个 事务和后退按钮将一起反转它们

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

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

所以你必须在最后做出承诺

为什么需要向addToBackStack传递null参数

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

公共抽象碎片事务addToBackStack(字符串名称)

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

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

关于:

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

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

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

您已经拥有片段实例
firstFragment
。所以我不知道你说的稍后获取碎片是什么意思

更多信息@


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

    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();
    }

addToBackStack(string name)
中的
标记
字符串提供了一种方法来定位后堆栈,以便以后直接弹出到该位置。这意味着要在方法
popToBackStack(字符串名称,int标志)
中使用:

从管理器的片段堆栈中弹出最后一个片段转换。此函数是异步的——它将请求排入pop队列,但在应用程序返回其事件循环之前,不会执行该操作

名称:如果非空,则为要查找的前一个返回状态的名称;如果找到,将弹出该状态之前的所有状态。POP_BACK_STACK_INCLUSIVE标志可用于控制命名状态本身是否弹出。如果为null,则仅弹出顶部状态

标志:0或POP_BACK_STACK_(包括)中的任意一个

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

例如,如果您对名为“frag1”、“frag2”、“frag3”、“frag4”的片段管理器进行了一系列的添加或替换,然后希望直接返回到使用addToBackStack(“frag2”)添加的片段2,则调用
popToBackStack(“frag2”,0)

所以

  • 使用
    .addToBackStack(“fragName”)
    :如果您想稍后
    popToBackStack(字符串名称,int标志)
    弹出多个后台堆栈

  • 使用
    .addToBackStack(null)
    :如果不希望以后弹出多个后台堆栈,但仍然希望一次弹出一个。即使不显式调用popToBackStack(),而是让back-press默认实现处理后堆栈,也要这样做

  • 使用
    .disallowedtobackstack()
    :如果不想使用back,请直接按下或调用popBackStack()。它将确保代码的任何部分都没有使用.addToBackStack()


在某些情况下,您必须调用该方法。您可以将片段名称作为参数传递给addToBackStack(name),而不是Null。如果传递Null,则无法使用FragmentManager.popbackbackstackimmediate方法(字符串名称,int标志);或popBackStack(字符串名称、int标志);因为名称为空。因此,popBackstack方法将不起作用。我建议您将片段名称作为参数传递,而不是传递null。您还可以将其添加到API文档中的答案中:将此事务添加到后堆栈。这意味着事务将在提交后被记住,并在稍后从堆栈弹出时反转其操作。参数名称此back stack状态的可选名称,或null。据我所知,添加到backstack的全部目的是执行导航,就像我们使用back按钮转到上一个片段一样?好的,如果您要将参数传递给addToBackStack,那么为什么我们需要执行
getFragmentManager().popBackStackImmediate()
如果“后退”按钮可以在有/无参数传递的情况下独自完成操作?看看-@VedPrakash的答案,你不需要。这也是一个不同的问题和答案
    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);