我的Backstack行为有问题。这就是我在做的事情:
add(fragment1) + addToBackStack(null)
replace(fragment2) + addToBackStack(null)
发生了什么:
现在我想用一个新的事务更改我的最后一个backstacked片段,这个事务放了一个新的backstack片段:
[frag1, frag2] becomes [frag1, frag3]
但popBackStack + replace
进行的此交易通过调用frag1
和onCreateView
来加载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事务。在这种情况下,我试图:
我希望它更清楚。
修改2
我已经填写了支持此行为的标志的请求功能。找到它here。
答案 0 :(得分:0)
首先,您应该了解backstack
不会保存片段,但会保存transactions
。当您致电popBackStack
时,它实际执行的操作是还原之前的transaction
。有关here的更多信息。
我认为你可以这样做:
addToBackStack
提供唯一名称而不是null来为您的交易命名。即addToBackStack("frag1")
。popBackStack + replace
,而只需致电replace
。onBackPressed
,如果显示的当前片段是Frag3(如果您在replace
方法中提供了标记,则可以使用findFragmentByTag
进行检查)您可以拨打getSupportFragmentManager().popBackStackImmediate("frag1", FragmentManager.POP_BACK_STACK_INCLUSIVE);
(或拨打super.onBackPressed
)