首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除android后台堆栈中的特定分片

如何删除android后台堆栈中的特定分片
EN

Stack Overflow用户
提问于 2015-07-03 13:07:25
回答 6查看 46K关注 0票数 24

我有一个关于从back中删除特定片段的问题stack.My场景是这样的: fragment -1替换为Fragment-2,然后Fragment-2替换为Fragment-3。

调用顺序;片段-1-->片段-2-->片段-3。

当Fragment-3出现在屏幕上,然后单击back按钮时,我想要转到

Fragment-1,这意味着我想从后台堆栈中删除Fragment-2。

该怎么做呢?

EN

回答 6

Stack Overflow用户

发布于 2015-07-03 13:24:27

在后台堆栈中,你没有Fragments,而是FragmentTransactions。当你popBackStack()事务时,会再次应用事务,但会向后应用。这意味着(假设您每次都使用addToBackStackTrace(null) )在您的后端堆栈中

代码语言:javascript
复制
1->2
2->3

如果您不将第二个事务添加到后栈,结果是您的后栈只是

代码语言:javascript
复制
1->2

因此,按下back按钮将导致执行2->1,这会导致一个错误,因为片段2不在那里(您在片段3上)。

最简单的解决方案是在从2到3之前弹出后台堆栈

代码语言:javascript
复制
//from fragment-2:
getFragmentManager().popBackStack();
getFragmentManager().beginTransaction()
   .replace(R.id.container, fragment3)
   .addToBackStack(null)
   .commit();

我在这里做的是:从片段2返回到片段1,然后直接转到片段3。这样,后退按钮将再次将我从3带到1。

票数 28
EN

Stack Overflow用户

发布于 2017-01-03 10:47:56

我有一个与您非常相似的场景,我的解决方案只是检查我拥有的backStack事务的数量。

如果事务大于0,那么我会立即弹出它,这样在按back时就会跳过它。

代码语言:javascript
复制
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStackImmediate();
}
...
fragmentTransaction.replace(R.id.main_fragment, newFrag, MAIN_FRAGMENT_TAG);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.commit();

这将成功地:

  • A -> B(背压式) -> back to A
  • A -> B -> C(背压式) -> back to A

(背压式)back to A

  • A->B->C(背压式)->back to A

我看到的唯一缺点是有一个快速的闪光,其中片段A在转到片段C之前显示。

票数 10
EN

Stack Overflow用户

发布于 2016-05-24 01:25:10

如果您要在同一个活动中添加/启动所有三个片段,而不是add(),请使用replace() (用Fragment3替换Fragment2 )。replace方法在添加新的片段之前从后台堆栈中移除当前片段。如果您从不同的activity启动Fragment3,因此不能使用replace(),请在启动新的activity (添加Fragment3)之前从backstack中删除Fragment2

代码语言:javascript
复制
// in Fragment2, before adding Fragment3:
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
               .remove(this) // "this" refers to current instance of Fragment2
               .commit();
fragmentManager.popBackStack();
// now go ahead and launch (add) fragment3
// if fragment3 is launched from a different activity, 
// start that activity instead
fragmentManager.beginTransaction()
               .add(R.id.a_container_view_in_activity, new Fragment3(),
                    Fargment3.FRAGMENT3_ID)
               .commit();
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31198894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档