从backstack问题中删除片段

时间:2015-08-31 19:02:06

标签: android android-fragments android-support-library

我有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中删除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已被删除,Fragment2可见。

即。我想要:

  1. 添加Fragment1,Fragment2,Fragment3,Fragment4

  2. 执行方法removeFragments(Fragment2,Fragment3),应删除此片段。 onCreateView必须才能执行。删除后我需要有Fragment1和Fragment4

  3. 按一次后退按钮:应该删除Fragment4而不使用onCreateView for Fragment4,Fragment1应该是可见的。

2 个答案:

答案 0 :(得分:1)

重要的一点是:在靠背上你没有片段,你有从一个片段转换到另一个片段。这意味着堆栈看起来像:

replace Fragment3 with Fragment4
replace Fragment2 with Fragment3
replace Fragment1 with Fragment2

当您弹出Backstack时,最顶层的转换将被恢复。你想要实现的是在靠背上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过渡,但我认为它只有在你添加片段而不是替换它们时才有效(不确定,但非常肯定的是当你按下后退按钮时它会抛出异常.. 。)

答案 1 :(得分:0)

要实现此目的,您应该覆盖onBackPressed

onBackPressed中,如果片段4处于活动状态,则应调用此方法,否则请调用super.onBackPressed()

getSupportFragmentManager().popBackStackImmediate(Fragment2, FragmentManager.POP_BACK_STACK_INCLUSIVE);

所以问题只取决于如何知道片段4是否有效,

  1. 使用FragmentManager.findFragmentByTag(),我可以看到你已经为你的片段添加了标签,你可以尝试搜索Fragment4,如果它返回的不是null,那么片段4是活动的,假设你只有这些4片段
  2. 我更喜欢这种方法,只需保留一个片段处于活动状态的变量,然后在addFragment中更新它。请注意,请记得将其保存在onSaveInstanceState
  3. 修改

    另一种解决方案是在添加Fragment4之前立即调用popBackStackImmediate(Fragment2, FragmentManager.POP_BACK_STACK_INCLUSIVE);,这可能会触发不需要的动画,但您可能需要尝试了解。