我有一个关于从back中删除特定片段的问题stack.My场景是这样的: fragment -1替换为Fragment-2,然后Fragment-2替换为Fragment-3。
调用顺序;片段-1-->片段-2-->片段-3。
当Fragment-3出现在屏幕上,然后单击back按钮时,我想要转到
Fragment-1,这意味着我想从后台堆栈中删除Fragment-2。
该怎么做呢?
发布于 2015-07-03 13:24:27
在后台堆栈中,你没有Fragments,而是FragmentTransactions。当你popBackStack()事务时,会再次应用事务,但会向后应用。这意味着(假设您每次都使用addToBackStackTrace(null) )在您的后端堆栈中
1->2
2->3如果您不将第二个事务添加到后栈,结果是您的后栈只是
1->2因此,按下back按钮将导致执行2->1,这会导致一个错误,因为片段2不在那里(您在片段3上)。
最简单的解决方案是在从2到3之前弹出后台堆栈
//from fragment-2:
getFragmentManager().popBackStack();
getFragmentManager().beginTransaction()
.replace(R.id.container, fragment3)
.addToBackStack(null)
.commit();我在这里做的是:从片段2返回到片段1,然后直接转到片段3。这样,后退按钮将再次将我从3带到1。
发布于 2017-01-03 10:47:56
我有一个与您非常相似的场景,我的解决方案只是检查我拥有的backStack事务的数量。
如果事务大于0,那么我会立即弹出它,这样在按back时就会跳过它。
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();这将成功地:
(背压式)back to A
我看到的唯一缺点是有一个快速的闪光,其中片段A在转到片段C之前显示。
发布于 2016-05-24 01:25:10
如果您要在同一个活动中添加/启动所有三个片段,而不是add(),请使用replace() (用Fragment3替换Fragment2 )。replace方法在添加新的片段之前从后台堆栈中移除当前片段。如果您从不同的activity启动Fragment3,因此不能使用replace(),请在启动新的activity (添加Fragment3)之前从backstack中删除Fragment2:
// 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();https://stackoverflow.com/questions/31198894
复制相似问题