目前在開發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();
}
參考資料: