管理Fragments

轉自: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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章