糾正對Fragment Transaction BackStack的誤解

目前在開發APP時,Fragment已經被開發者廣泛使用,但Fragment的BackStack卻被很多開發者誤解。所以這篇博客就討論下Fragment的BackStack及一些相關的常用接口。首先需要明確的是,FragmentActivity的FragmentManager是處理Fragment Transaction的而不是處理Fragment。BackStack內部的一個Transaction可以包含一個或多個和Fragment相關的操作。

FragmentTransaction ft = getFragmentManager().beginTransaction();  
ft.add(restId, fragmentA);  
ft.replace(fragmentB);  
ft.commit();  
上面的一個FragmentTransaction既包含add操作又包含replace操作。

FragmentTransaction默認並不會主動被加入到BackStack中,除非開發者調用了addToBackStack(String tag)方法。參數'tag'將作爲本次加入BackStack的Transaction的標誌。

FragmentTransaction ft = getFragmentManager().beginTransaction();  
ft.add(resId, fragmentA);  
ft.replace(resId, fragmentB);  
ft.addToBackstack("tag");  
ft.commit(); 
和addToBackStack相對應的接口方法是popBackStack(),調用該方法後會將事物操作插入到FragmentManager的操作隊列,只有當輪詢到該事物時才能執行。所以Google還提供了可以立刻執行的接口

popBackStackImmediate() 

下面舉例說明Transaction BackStack的進棧和出棧。

如下圖,使用FragmentActivity的FragmentManager創建Trasaction1並提交,使頁面顯示AFragment。這時調用popBackStack()就會移除AFragment並返回FragmentActivity。

@Override  
public void addFragment(BaseFragment baseFragment) {        
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();  
    ft.replace(R.id.home_frame_layout_for_fragments, baseFragment, baseFragment.getTagText());  
    ft.addToBackStack(baseFragment.getTagText());  
    ft.commit();  
}  

在AFragment已經在棧頂的情況下,我們再創建Transation2並提交,Transaction 2添加了兩個Fragment,提交後頁面顯示的是CFragment,這時調用popBackStack()就會將Transaction2從BackStack移除,即將CFragment和BFragment同時移除,頁面將顯示AFragment。

@Override  
public void addMultipleFragments(BaseFragment[] baseFragments) {  
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();  
          
    for(int i = 0 ; i < baseFragments.length ; i++) {  
        ft.replace(R.id.home_frame_layout_for_fragments, baseFragments[i], baseFragments[i].getTagText());  
    }     
    ft.addToBackStack(baseFragments[0].getTagText());  
    ft.commit();  
}  

參考資料:

Transaction BackStack and its management

轉自:http://blog.csdn.net/guxiao1201/article/details/40476267






發佈了7 篇原創文章 · 獲贊 60 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章