我有4个带有标签Fragment1,Fragment2,Fragment3和Fragment4的片段。
我在屏幕上添加了片段(1..4):
public void addFragment(Fragment fragment, String tag) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(myLayoutId, fragment, tag);
transaction.addToBackStack(tag);
transaction.commit();
fragmentManager.executePendingTransactions();
}
如何从Backstack Instant中删除Fragment2和Fragment3?
场景1
getSupportFragmentManager().popBackStackImmediate(Fragment2, FragmentManager.POP_BACK_STACK_INCLUSIVE);
此代码删除了Fragment2,Fragment3,Fragment4。
方案2
getSupportFragmentManager().popBackStackImmediate(Fragment3, 0);
getSupportFragmentManager().popBackStackImmediate(Fragment2, 0);
此代码为Fragment3和Fragment2调用onCreateView(为什么?!)。但是片段4已被删除,并且片段2是可见的。
即我想要:
添加Fragment1,Fragment2,Fragment3,Fragment4
执行方法removeFragments(Fragment2,Fragment3)并应删除此片段。 onCreateView不能执行。删除后,我需要Fragment1和Fragment4
按下返回按钮一次:应该删除Fragment4,而不要使用onCreateView for Fragment4,Fragment1应该可见。
最佳答案
重要的一件事:在后堆栈上没有片段,您已经从一个片段过渡到另一个片段。这意味着堆栈看起来像:
replace Fragment3 with Fragment4
replace Fragment2 with Fragment3
replace Fragment1 with Fragment2
弹出后退堆栈时,将恢复最顶层的过渡。您想要实现的是在堆栈
replace Fragment1 with Fragment4
上,因此,在还原它时,您将直接从Fragment4跳转到Fragment1。为此,您需要弹出堆栈,直到到达Fragment1,然后插入Fragment4,例如,当您从3转到4时,您可以getSupportFragmentManager().popBackStackImmediate(Fragment2, FragmentManager.POP_BACK_STACK_INCLUSIVE);
transaction.replace(myLayoutId, fragment4, tag).addToBackStack(tag).commit();
还有一个
remove
过渡,但是我认为它仅在您添加片段而不是替换它们时才起作用(不确定这一点,但是很肯定,当您按下后退按钮时它将抛出异常...)