FragmentTransaction與FragmentManager

FragmentManage:動畫

FragmentManager可以實現管理activity中fragment. 經過調用activity的getFragmentManager()取得它的實例.spa

FragmentManager能夠作以下一些事情:線程

一、使用findFragmentById() (用於在activity layout中提供一個UI的fragment)或findFragmentByTag()code

   (適用於有或沒有UI的fragment)獲取activity中存在的fragmentorm

二、將fragment從後臺堆棧中彈出, 使用 popBackStack() (模擬用戶按下BACK 命令).事務

三、使用addOnBackStackChangeListener()註冊一個監聽後臺堆棧變化的listener.rem

  

FragmentTransactionget

      FragmentTransaction對fragment進行添加,移除,替換,以及執行其餘動做。it

從 FragmentManager 得到一個FragmentTransaction的實例 :io

FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

每個事務都是同時要執行的一套變化.能夠在一個給定的事務中設置你想執行的全部變化,使用諸如 add(), remove(), 和 replace().而後, 要給activity應用事務, 必須調用 commit().

在調用commit()以前, 你可能想調用 addToBackStack(),將事務添加到一個fragment事務的back stack. 這個back stack由activity管理, 並容許用戶經過按下 BACK 按鍵返回到前一個fragment狀態.

舉個例子, 這裏是如何將一個fragment替換爲另外一個, 並在後臺堆棧中保留以前的狀態:

// 建立新的fargment和事務
Fragment newFragment = new ExampleFragment();  
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
// 取代當前容器由R.id.fragment_container標識的fragment並添加到後臺堆棧
transaction.replace(R.id.fragment_container,newFragment);  
transaction.addToBackStack(null);  
// 提交事務
transaction.commit();

在這個例子中, 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().

相關文章
相關標籤/搜索