我有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过渡,但是我认为它仅在您添加片段而不是替换它们时才起作用(不确定这一点,但是很肯定,当您按下后退按钮时它将抛出异常...)

10-07 13:08