天天看點

Android FragmentManage FragmentTransaction介紹

FragmentManager能夠實作管理activity中fragment. 通過調用activity的getFragmentManager()取得它的執行個體.

FragmentManager可以做如下一些事情:

1、使用findFragmentById() (用于在activity layout中提供一個UI的fragment)或findFragmentByTag()    (适用于有或沒有UI的fragment)擷取activity中存在的fragment 2、将fragment從背景堆棧中彈出, 使用 popBackStack() (模拟使用者按下BACK 指令). 3、使用addOnBackStackChangeListener()注冊一個監聽背景堆棧變化的listener.

      FragmentTransaction對fragment進行添加,移除,替換,以及執行其他動作。

從 FragmentManager 獲得一個FragmentTransaction的執行個體 :

每一個事務都是同時要執行的一套變化.可以在一個給定的事務中設定你想執行的所有變化,使用諸如 add(), remove(), 和 replace().然後, 要給activity應用事務, 必須調用 commit().

在調用commit()之前, 你可能想調用 addToBackStack(),将事務添加到一個fragment事務的back stack. 這個back stack由activity管理, 并允許使用者通過按下 BACK 按鍵傳回到前一個fragment狀态.

舉個例子, 這裡是如何将一個fragment替換為另一個, 并在背景堆棧中保留之前的狀态:

在這個例子中, newFragment 替換了目前layout容器中的由R.id.fragment_container辨別的fragment.通過調用 addToBackStack(), replace事務被儲存到back stack, 是以使用者可以回退事務,并通過按下BACK按鍵帶回前一個fragment.

如果添加多個變化到事務(例如add()或remove())并調用addToBackStack(), 然後在你調用commit()之前的所有應用的變化會被作為一個單個事務添加到背景堆棧, BACK按鍵會将它們一起回退.

添加變化到 FragmentTransaction的順序不重要, 除以下例外:

必須最後調用 commit().

如果添加多個fragment到同一個容器, 那麼添加的順序決定了它們在view hierarchy中顯示的順序.

當執行一個移除fragment的事務時, 如果沒有調用 addToBackStack(), 那麼當事務送出後, 那個fragment會被銷毀,并且使用者不能導航回到它. 有鑒于此, 當移除一個fragment時,如果調用了 addToBackStack(), 那麼fragment會被停止, 如果使用者導航回來,它将會被恢複.

提示: 對于每一個fragment事務, 你可以應用一個事務動畫, 通過在送出事務之前調用setTransition()實作.

調用 commit() 并不立即執行事務.恰恰相反, 它将事務安排排期, 一旦準備好, 就在activity的UI線程上運作(主線程).如果有必要, 無論如何, 你可以從你的UI線程調用 executePendingTransactions() 來立即執行由commit()送出的事務. 但這麼做通常不必要, 除非事務是其他線程中的job的一個從屬.

警告: 你隻能在activity儲存它的狀态(當使用者離開activity)之前使用commit()送出事務.

如果你試圖在那個點之後送出, 會抛出一個異常.這是因為如果activity需要被恢複, 送出之後的狀态可能會丢失.對于你覺得可以丢失送出的狀況, 使用 commitAllowingStateLoss().

     本文轉自xyz_lmn51CTO部落格,原文連結:http://blog.51cto.com/xyzlmn/817250,如需轉載請自行聯系原作者

繼續閱讀