popBackStack时预加载片段

时间:2015-02-18 10:34:35

标签: android android-fragments fragment-backstack

我的Backstack行为有问题。这就是我在做的事情:

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

发生了什么:

  • 片段1已添加并位于Backstack中
  • 然后第二个片段替换第一个片段并将其添加到Backstack中。

现在我想用一个新的事务更改我的最后一个backstacked片段,这个事务放了一个新的backstack片段:

[frag1, frag2] becomes [frag1, frag3]

popBackStack + replace进行的此交易通过调用frag1onCreateView来加载onActivityCreated。我知道这是预期的行为,因为这是后台堆栈的工作原理,但我试图找到一种方法来避免这种预加载。

修改

在这个问题中,我使用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

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

1 个答案:

答案 0 :(得分:0)

首先,您应该了解backstack不会保存片段,但会保存transactions。当您致电popBackStack时,它实际执行的操作是还原之前的transaction。有关here的更多信息。

我认为你可以这样做:

  1. 通过为addToBackStack提供唯一名称而不是null来为您的交易命名。即addToBackStack("frag1")
  2. 请勿拨打popBackStack + replace,而只需致电replace
  3. 然后,在您的活动中,覆盖您的onBackPressed,如果显示的当前片段是Frag3(如果您在replace方法中提供了标记,则可以使用findFragmentByTag进行检查)您可以拨打getSupportFragmentManager().popBackStackImmediate("frag1", FragmentManager.POP_BACK_STACK_INCLUSIVE);(或拨打super.onBackPressed