今天講解一下Fragment的控制,主要是切換View和頁面替換等操作。還有就是如何獲取Fragment的管理對象,以及與Activity的通信方式。
1、管理Fragment
要在activity中管理fragment,需要使用FragmentManager. 通過調用activity的getFragmentManager()取得它的實例.
•可以通過FragmentManager做一些事情, 包括: 使用findFragmentById()(用于在activity layout中提供一個UI的fragment)或findFragmentByTag()(適用于有或沒有UI的fragment)獲取activity中存在的fragment。
•將fragment從后臺堆棧中彈出, 使用 popBackStack() (模擬用戶按下BACK 命令)。
•使用addOnBackStackChangeListener()注冊一個監聽后臺堆棧變化的listener。
2、處理Fragment事務
關于在activity中使用fragment的很強的一個特性是:根據用戶的交互情況,對fragment進行添加、移除、替換以及執行其他動作。提交給activity的每一套變化被稱為一個事務,可以使用在FragmentTransaction中的 API 處理。我們也可以保存每一個事務到一個activity管理的backstack,允許用戶經由fragment的變化往回導航(類似于通過 activity往后導航)。
從 FragmentManager 獲得一個FragmentTransaction實例:
在調用commit()之前,你可能想調用 addToBackStack(),將事務添加到一個fragment事務的backstack。這個back stack由activity管理, 并允許用戶通過按下 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()提交的事務。但這么做通常不必要,除非事務是其他線程中的任務的一個從屬。
警告:你只能在activity保存它的狀態(當用戶離開activity)之前使用commit()提交事務.
3、與Activity通信
盡管Fragment被實現為一個獨立于Activity的對象,并且可以在多個activity中使用,但一個給定的fragment實例是直接綁定到包含它的activity的。 特別的fragment可以使用 getActivity() 訪問Activity實例, 并且容易地執行比如在activity layout中查找一個view的任務。如下面的代碼:
新聞熱點
疑難解答
圖片精選