首页 文章

从backstack问题中删除片段

提问于
浏览
2

我有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立即?

Scenario 1

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

此代码删除了Fragment2,Fragment3,Fragment4 .

Scenario 2

getSupportFragmentManager().popBackStackImmediate(Fragment3, 0);
getSupportFragmentManager().popBackStackImmediate(Fragment2, 0);

这段代码为 calls onCreateView for Fragment3和Fragment2(为什么?!) . 但片段4已被删除,Fragment2可见 .

即我想:

  • 添加Fragment1,Fragment2,Fragment3,Fragment4

  • 执行方法removeFragments(Fragment2,Fragment3)和这些片段应该被删除 . onCreateView must NOT 被执行 . 删除后我需要有Fragment1和Fragment4

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

2 回答

  • 1

    一件重要的事情:在靠背上你没有碎片,你有 transition from one fragment to the other . 这意味着堆栈看起来像:

    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 转换,但我认为它只有在你添加片段而不是替换它们时才有效(不确定,但是当你按下后退按钮时它会抛出异常非常肯定......)

  • 0

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

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

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

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

    • 使用 FragmentManager.findFragmentByTag() ,我可以看到你已经为你的片段添加了标签,你可以尝试搜索Fragment4,如果它返回的不是null,那么Fragment 4是活动的,假设你只有这4个片段

    • 我更喜欢这种方法,只需保留一个变量,其中Fragment处于活动状态,您可以在 addFragment 中更新它 . 小心,记得把它保存在 onSaveInstanceState 中 .

    Edit:

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

相关问题