轉自:http://www.cnblogs.com/mengdd/archive/2013/01/09/2853254.html
FragmentManager
爲了管理Activity中的fragments,需要使用FragmentManager.
爲了得到它,需要調用Activity中的getFragmentManager()方法。
因爲FragmentManager的API是在Android 3.0,也即API level 11開始引入的,所以對於之前的版本,需要使用support library中的FragmentActivity,並且使用getSupportFragmentManager()方法。
用FragmentManager可以做的工作有:
得到Activity中存在的fragment:
使用findFragmentById()或findFragmentByTag()方法。
將fragment彈出back stack:
popBackStack():將back stack中最後一次的fragment轉換彈出。如果沒有可以出棧的東西,返回false。
這個函數是異步的:它將彈出棧的請求加入隊列,但是這個動作直到應用回到事件循環纔會執行。
爲back stack加上監聽器:
addOnBackStackChangedListener()
Performing Fragment Transactions
使用Fragment時,可以通過用戶交互來執行一些動作,比如增加、移除、替換等。
所有這些改變構成一個集合,這個集合被叫做一個transaction。
可以調用FragmentTransaction中的方法來處理這個transaction,並且可以將transaction存進由activity管理的back stack中,這樣用戶就可以進行fragment變化的回退操作。
可以這樣得到FragmentTransaction類的實例:
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每個transaction是一組同時執行的變化的集合。
用add(), remove(), replace()方法,把所有需要的變化加進去,然後調用commit()方法,將這些變化應用。
在commit()方法之前,你可以調用addToBackStack(),把這個transaction加入back stack中去,這個back stack是由activity管理的,當用戶按返回鍵時,就會回到上一個fragment的狀態。
比如下面的代碼就是用一個新的fragment取代之前的fragment,並且將前次的狀態存儲在back stack中。
// Create new fragment and transactionFragment newFragment = new ExampleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction();// Replace whatever is in the fragment_container view with this fragment,// and add the transaction to the back stacktransaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null);// Commit the transactiontransaction.commit();
在這個例子中,newFragment將取代在R.id.fragment_container容器中的fragment,如果沒有,將直接添加新的fragment。
通過調用addToBackStack(),commit()的一系列轉換作爲一個transaction被存儲在back stack中,用戶按Back鍵可以返回上一個轉換前的狀態。
當你移除一個fragment的時候,如果commit()之前沒有調用addToBackStack(),那個fragment將會是destroyed;如果調用了addToBackStack(),這個fragment會是stopped,可以通過返回鍵來恢復。
關於commit()方法
調用commit()方法並不能立即執行transaction中包含的改變動作,commit()方法把transaction加入activity的UI線程隊列中。
但是,如果覺得有必要的話,可以調用executePendingTransactions()方法來立即執行commit()提供的transaction。
這樣做通常是沒有必要的,除非這個transaction被其他線程依賴。
注意:你只能在activity存儲它的狀態(當用戶要離開activity時)之前調用commit(),如果在存儲狀態之後調用commit(),將會拋出一個異常。
這是因爲當activity再次被恢復時commit之後的狀態將丟失。如果丟失也沒關係,那麼使用commitAllowingStateLoss()方法。
實例程序
寫了個小程序實踐了一下fragment的管理,程序不是很完善,就是試試基本用法,先按第一個按鈕添加一個fragment,第二個按鈕將其替換,第三個按鈕將第二個按鈕添加的fragment刪除。
相關代碼:
第一個fragment:
ExampleFragment.java
它的佈局:
example_fragment_layout.xml
第二個fragment:
NewFragment.java
new_fragment_layout.xml
主Activity:
LearnFragment.java
activity_learn_fragment.xml
資源:
strings.xml
程序運行截圖:
參考資料:
API Guides:Fragments
http://developer.android.com/guide/components/fragments.html
FragmentManager類文檔:
http://developer.android.com/reference/android/app/FragmentManager.html
FragmentTransaction類文檔
http://developer.android.com/reference/android/app/FragmentTransaction.html