我对 backstack 行为有疑问。这就是我正在做的事情:
add(fragment1) + addToBackStack(null)
replace(fragment2) + addToBackStack(null)
怎么了:
- Fragment 1 被添加并在 backstack 中
- 然后第二个片段替换第一个片段并将其添加到后台堆栈。
现在我想用一个新的事务来改变我的最后一个 backstacked 片段,该事务放置一个新的 backstack 片段,所以:
[frag1, frag2] becomes [frag1, frag3]
但是这个由 apopBackStack + replace
进行的事务是frag1
通过调用它的onCreateView
and来加载的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
我已经为支持此行为的标志填写了请求功能。在这里找到它。