繁体   English   中英

从 backstack 问题中删除片段

[英]Remove fragment from backstack issue

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

场景一

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

此代码删除了 Fragment2、Fragment3、Fragment4。

场景二

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

此代码为 Fragment3 和 Fragment2调用 onCreateView (为什么?!)。 但是 Fragment 4 已经被移除,并且 Fragment2 是可见的。

即我想要:

  1. 添加 Fragment1、Fragment2、Fragment3、Fragment4

  2. 执行方法 removeFragments(Fragment2, Fragment3) 并且应该删除此片段。 不得执行onCreateView 删除后我需要有 Fragment1 和 Fragment4

  3. 按一次后退按钮: Fragment4 应该在没有 onCreateView for Fragment4 的情况下被删除,Fragment1 应该是可见的。

一件重要的事情:在 backstack 上你没有片段,你可以从一个片段过渡到另一个 这意味着堆栈看起来像:

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

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

为此,您应该覆盖onBackPressed

onBackPressed ,如果 Fragment 4 处于活动状态,您应该调用它,否则调用super.onBackPressed()

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

所以问题只归结为如何知道 Fragment 4 是否处于活动状态,

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

编辑:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM