2013-02-20 92 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