假設我有一個包含兩個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()
僅從視圖中刪除片段,並且不會將視圖轉換回先前顯示的片段。
如果FragmentTransaction.remove「只從視圖中刪除片段,不轉型視圖」,那麼什麼是表示風景?但是我可以看到,爲什麼這可能會導致混亂,如果經理保留一堆碎片但不知道哪些可以同時可見,即,如何知道當A2處於疊加麼? – gordonwd 2012-01-07 22:31:50
如果一個視圖(在我的情況下是FrameLayout)使用'FragmentTransaction.add(int,Fragment)'方法添加了多個Fragments,然後調用'FragmentTransaction.remove(Fragment).commit()'我相信會離開顯示最後添加到它的片段的FrameLayout。但是,使用'FragmentTransaction.replace(int,Fragment)'方法將Fragment添加到View中(就像我在做的那樣,假設這對內存更好?)將使FrameLayout無子級(即,顯示爲空視圖) ... – 2012-01-08 08:23:34
添加到我以前的評論:我可以看到有一些有用的方法,如'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