What is the meaning of addToBackStack with null parameter?

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

This activity contains the following code for any fragment at the method end of that fragment-

例如:

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

So,

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

2) Why you need to pass a null parameter to addToBackStack ?

3)如何得到这样添加后的片段?

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

108589 次浏览

AddToBackStack (null)后面跟一个 commit ()是什么意思?

引用文件:

通过调用 addToBackStack () ,替换事务保存到 返回堆栈,以便用户可以逆转事务并返回 通过按下返回按钮来完成上一个片段。

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

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

你必须最后打电话给 commit()。如果要将多个片段添加到同一个容器中,那么添加它们的顺序决定了它们在视图层次结构中出现的顺序。

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

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

它不需要为 null,它可以是一个字符串。

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

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

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

Concerning:

看起来这个代码没有用,因为我没有运行最后一个代码 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)

你的回答不适用。如果您不想向后堆栈添加片段,应该使用下面的代码片段:

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

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

Pop the last fragment transition from the manager's fragment back stack. This function is asynchronous -- it enqueues the request to pop, but the action will not be performed until the application returns to its event loop.

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

标志: 0或者 POP _ Back _ STACK _ INCLISIVE。

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

例如,如果您对片段管理器进行了一系列的添加或替换,给出了名称“ frag 1”、“ frag 2”、“ frag 3”、“ frag 4”,然后希望直接返回到使用 addToBackStack (“ frag 2”)添加的片段2,那么您可以调用 popToBackStack("frag2", 0)

那么,

  • 使用 .addToBackStack("fragName"): 如果您希望后面的 popToBackStack(String name, int flags)可以弹出多个回退堆栈。

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

  • 使用 .disallowAddToBackStack(): 如果您不想显式地使用背压或调用 popBackStack () ,请使用 .disallowAddToBackStack()。它将确保代码中没有使用。AddToBackStack ().