2013-02-20 67 views
43

我有一个活动A,它调用片段Bf,它调用片段Cf.当Cf被调用时,我希望Bf被放置在后台堆栈中,以便用户可以导航回到它。但是,如果在Cf中按下特定的按钮,我希望将Bf从后台堆栈中移除。这可能吗?如何在后台弹出片段

我看到有一个popBackStack()函数。不过,我很困惑这将如何工作。使用此功能安全吗? Bf在后台堆栈上插入不同应用程序的活动是否有可能被插入?

另外,有没有什么办法来改变在堆叠片段的savedInstanceState?

我只是无法弄清楚如何在使用模拟器的backstack上进行可靠的测试。

+0

避免!它并没有真正帮助整体效率!使用普通的替换(),甚至更好地移除/添加每次你想浏览!检查我的帖子http://stackoverflow.com/questions/5802141/is-this-the-right-way-to-clean-up-fragment-back-stack-when-leaving-a-deeply-nest/26093368# 26093368 – 2014-09-29 06:01:23

+0

@stack_ved不是一个好主意。 BackStacks是一件好事。顺便说一句,我看不到你的帖子。我想这是downvoted。 :P – Sufian 2016-11-18 15:04:38

回答

86

您可以按名称弹出片段。在添加碎片到后端堆栈时,只需给他们一个名字。

fragmentTransaction.addToBackStack("fragB"); 
fragmentTransaction.addToBackStack("fragC"); 

然后在Fragment_C,使用该名称即.. fragB弹出返回堆叠,包括使用回栈POP_BACK_STACK_INCLUSIVE

someButtonInC.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     FragmentManager fm = getActivity() 
       .getSupportFragmentManager(); 
     fm.popBackStack ("fragB", FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 
}); 
+9

即使我们在fm.popBackStack方法中也没有传递任何参数,它仍然可以工作。 fm.popBackStack(); – Kailas 2014-03-06 10:53:50

+0

如果我想在后退按钮上按下按钮,该怎么办? – Akshay 2014-03-15 11:18:00

+0

@Akki如果您使用添加到后台堆栈,它将弹出最后一个片段,当您点击后退导航项时。因此,不需要额外的步骤来执行正常的导航回来。只有当您需要重新按下后退按钮时,您才需要执行除正常后退导航之外的操作。 – ocross 2014-07-09 19:44:56