0

我对 backstack 行为有疑问。这就是我正在做的事情:

add(fragment1) + addToBackStack(null)
replace(fragment2) + addToBackStack(null)

怎么了:

  • Fragment 1 被添加并在 backstack 中
  • 然后第二个片段替换第一个片段并将其添加到后台堆栈。

现在我想用一个新的事务来改变我的最后一个 backstacked 片段,该事务放置一个新的 backstack 片段,所以:

[frag1, frag2] becomes [frag1, frag3]

但是这个由 apopBackStack + replace进行的事务是frag1通过调用它的onCreateViewand来加载的onActivityCreated。我知道这是预期的行为,因为这是 backstack 的工作方式,但我试图找到一种方法来避免这种预加载。

编辑

在这个问题中,我使用 backstack 片段的概念来使交易更加清晰。这里的每笔交易都是一个添加+删除(这是一个替换)。我正在使用的替换代码是:

public int replaceFragment(BaseFragment newFragment, boolean addToBackStack, boolean animated, PopStackMode popMode) {
    if (popMode != null) {
        getSupportFragmentManager().popBackStack(newFragment.getFragmentTag(), popMode == PopStackMode.POP_INCLUSIVE ? FragmentManager
                .POP_BACK_STACK_INCLUSIVE : 0);
    }
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if (animated) {
        ft.setCustomAnimations(R.anim.slide_in_left, 0, R.anim.slide_out_right, 0);
    }
    ft.replace(R.id.fragment_container, newFragment, newFragment.getFragmentTag());
    if (addToBackStack) {
        ft.addToBackStack(newFragment.getFragmentTag());
    }
    return ft.commit();
}

你可以看到我正在创建基于片段 backstack 的导航历史,因为它是一种浏览器。当添加一个“页面”时,会有一个片段和一个 backstack 事务。在这种情况下,我试图:

  • 删除当前片段。
  • 从 backstack 中删除事务。
  • 添加一个新的片段,而不弹出和加载前一个 backstack 片段。

我希望它更清楚。

编辑 2

我已经为支持此行为的标志填写了请求功能。在这里找到它。

4

1 回答 1

0

首先,您应该了解backstack不保存片段,而是保存transactions。当您调用popBackStack它实际上所做的是恢复以前的transaction. 更多关于这个here

我认为你可以这样做:

  1. 通过为您提供唯一名称addToBackStack而不是 null 来命名您的交易。即addToBackStack("frag1")
  2. 不要打电话popBackStack + replace,而只是打电话replace
  3. 然后,在您的活动中,覆盖您的onBackPressed,如果当前显示的片段是 Frag3(findFragmentByTag如果您在方法中提供了标签,则可以使用它来检查replace)您可以调用getSupportFragmentManager().popBackStackImmediate("frag1", FragmentManager.POP_BACK_STACK_INCLUSIVE);(否则调用super.onBackPressed
于 2015-02-18T11:14:09.937 回答