2012-01-07 70 views
44

Activity layout picture如何彈出具有多個碎片的Activity的堆棧?

假設我有一個包含兩個FrameLayouts的活動(姑且稱之爲FrameA和FrameB),這反過來又每個包含片段(讓我們分別給他們打電話FragmentA1和FragmentB1)。現在,我承諾使用類似於下面的代碼一系列單個片段的交易...

getFragmentManager() 
.beginTransaction() 
.replace(frameId, fragment) 
.addToBackStack(null) 
.commit(); 

......這樣的,我在FragmentA2 FrameA取代FragmentA1,然後我更換FragmentB1在FrameB與FragmentB2,然後我用FragmentA3替換FrameA中的FragmentA2,然後用FragmentB3替換Frame2中的FragmentB2,最終狀態如上圖所示(只有FragmentA3和FragmentB3可見)。

如果我正確理解了背堆棧是如何工作的,那麼按'back'將在FrameA和FrameB之間插入碎片的彈出窗口(反映我如何添加它們)。

有誰知道是否有可能選擇性地彈出FrameA或FrameB上的最後一個事務? (也就是說,如果我按「波普FrameA」然後FrameA將被轉移回從FragmentA3到FragmentA2,相反,如果我按「波普FrameB」然後FrameB將不會發生任何FragmentB3轉變回FragmentB2)

補充:我知道我可以使用FragmentManager.findFragmentById(int framelayoutId)方法將片段最後添加到給定的FrameLayout,但是調用FragmentTransaction.remove(fragment).commit()僅從視圖中刪除片段,並且不會將視圖轉換回先前顯示的片段。

+1

如果FragmentTransaction.remove「只從視圖中刪除片段,不轉型視圖」,那麼什麼是表示風景?但是我可以看到,爲什麼這可能會導致混亂,如果經理保留一堆碎片但不知道哪些可以同時可見,即,如何知道當A2處於疊加麼? – gordonwd 2012-01-07 22:31:50

+0

如果一個視圖(在我的情況下是FrameLayout)使用'FragmentTransaction.add(int,Fragment)'方法添加了多個Fragments,然後調用'FragmentTransaction.remove(Fragment).commit()'我相信會離開顯示最後添加到它的片段的FrameLayout。但是,使用'FragmentTransaction.replace(int,Fragment)'方法將Fragment添加到View中(就像我在做的那樣,假設這對內存更好?)將使FrameLayout無子級(即,顯示爲空視圖) ... – 2012-01-08 08:23:34

+0

添加到我以前的評論:我可以看到有一些有用的方法,如'FragmentManager.getBackStackEntryAt(int index)','FragmentManager。popBackStack(String name,int flags)','popBackStack(int id,int flags)','FragmentTransaction.addToBackStack(String name)'和'FragmentTransaction.replace(int containerViewId,Fragment fragment,String tag)',只是不確定如何將他們彙集在一起​​,以實現我所需要的... – 2012-01-08 08:30:25

回答

22

基本上,不,活動只有一個後退棧。

你只需要實現你自己的單獨的背堆棧。

就Android 4.0(以及相關的支持庫)有API的,應該使這個相對容易的 - FragmentTransaction.detach(Fragment)可以讓你把一個片段到相同的狀態,它是在返回堆疊時,和FragmentManager.saveFragmentInstanceState(Fragment)讓你走的更遠並完全丟棄Fragment對象。不巧的是,它們分別用於實現ViewPager的FragmentPagerAdapter和FragmentStatePagerAdapter,因此您可以將這些代碼看作如何使用它們的示例。

+0

感謝Hackbod的迴應。我必須在我所知道的方面取得進展,所以我在_adding_(而不是_replacing_)片段A2之前隱藏片段A1,然後在片段A2被刪除時再次顯示_showing_片段A1。它爲我工作,但一定會按照您在未來項目中描述的方式實施我自己的後退堆棧,或者現在出現任何不良行爲: - \再次感謝。 – 2012-01-17 11:40:33