首先獲取FragmentTransaction對象:FragmentTransaction transaction = getFragmentManager().beginTransaction();
兩種方法不同之處:是否要清空容器再添加fragment的區別,用法上add配合hide或是remove使用,replace一般單獨出現。
添加
一般會配合hide使用:transaction.add(R.id.fragment_container, oneFragment).hide(twoFragment).commit();
1.第一個參數是容器id, 第二個參數是要添加的fragment,添加不會清空容器中的內容,不停的往里面添加
2.不允許添加同一個fragment實例,這是非常重要的特點。如果一個fragment已經進來的話,再次添加的話會報異常錯誤的。
3.添加進來的fragment都是可見的(visible),后添加的fragment會展示在先添加的fragment上面,在繪制界面的時候會繪制所有可見的view
4.所以大多數add都是和hide或者是remove同時使用的。這樣可以節省繪制界面的時間,節省內存消耗,是推薦的用法。
替換
transaction.replace(R.id.fragment_container, oneFragment).commit();
1.替換會把容器中的所有內容全都替換掉,有一些app會使用這樣的做法,保持只有一個fragment在顯示,減少了界面的層級關系。
相同之處:每次add和replace都要走一遍fragment 的周期。
其實fragment一般不會這么簡單使用,replace的使用場景一般不多,大多數是添加(add)和顯示(show)配合隱藏(hide)來使用,這樣首先避免相同類型的fragment的重復添加,提示開發者使用單例模式,已經添加過的fragment很多情況沒有必要再次添加,而且還有把生命周期再走一遍,這是一種比較浪費的做法
最合適的處理方式是這樣的:
1.在add的時候,加上一個tab參數
transaction.add(R.id.content, IndexFragment,”Tab1″);
2.然后當IndexFragment引用被回收置空的話,先通過
IndexFragment=FragmentManager.findFragmentByTag(“Tab1″);
找到對應的引用,然后繼續上面的hide,show;
http://blog.csdn.net/shimiso/article/details/44677007