我們可以把fragment想象成activity中一個模塊化的部分,它擁有自己的生命周期,接收自己的輸入事件,可以在acvitity運行過程中添加或者移除(有點像"子activity",可以在不同的activity里面重復使用)。
Note:如果APP的最低API版本是11或以上,則不必使用Support Library。
創(chuàng)建一個Fragment類
創(chuàng)建一個fragment,首先需要繼承Fragment類,然后在關鍵的生命周期方法中插入APP的邏輯,就像activity一樣。
必須重寫onCreateView()回調方法來定義布局。
一、用XML將fragment添加到activity
當屏幕被認為是large(用目錄名稱中的large字符來區(qū)分)時,它在布局中增加了兩個fragment.
Notes:FragmentActivity是Support Library提供的一個特殊activity ,用于處理API11版本以下的fragment。如果我們APP中的最低版本大于等于11,則可以使用普通的Activity。
如果用的是v7 appcompat library,activity應該改為繼承ActionBarActivity,ActionBarActivity是FragmentActivity的一個子類(更多關于這方面的內容,請閱讀Adding the Action Bar)。
Note:當通過XML布局文件的方式將Fragment添加進activity時,Fragment是不能被動態(tài)移除的。
二、靈活動態(tài)添加 Fragment
FragmentManager類為在activity運行時對fragment進行添加,移除,替換等操作提供了方法,來實現動態(tài)的用戶體驗。
在activity運行時添加fragment
為了執(zhí)行fragment的增加或者移除操作,必須通過FragmentManager創(chuàng)建一個FragmentTransaction對象, FragmentTransaction提供了用來增加、移除、替換以及其它一些操作的APIs。
我們應該在activity的onCreate()方法中添加初始化。
在布局中必須有一個容器View,動態(tài)添加fragment。
為了替換fragment,這個Activity的布局包含了一個空的FrameLayout作為fragment的容器。
在activity中,用Support Library APIs調用getSupportFragmentManager()方法獲取FragmentManager對象,然后調用beginTransaction()方法創(chuàng)建一個FragmentTransaction對象,然后調用add()方法添加一個fragment.
可以使用同一個FragmentTransaction進行多次fragment事務。完成這些變化操作,準備開始執(zhí)行改變時,必須調用commit()方法。
替換Fragment
替換fragment的過程類似于添加過程,只需要將add()方法替換為replace()方法。
記住在執(zhí)行fragment事務時,如移除或者替換,我們經常要適當地讓用戶可以向后導航與"撤銷"這次改變。為了讓用戶向后導航fragment事務,我們必須在FragmentTransaction提交前調用addToBackStack()方法。
Note:當移除或者替換一個fragment并把它放入返回棧中時,被移除的fragment的生命周期是stopped(不是destoryed).當用戶返回重新恢復這個fragment,它的生命周期是restarts。如果沒有把fragment放入返回棧中,那么當它被移除或者替換時,其生命周期是destoryed。
addToBackStack()方法提供了一個可選的String參數為事務指定了一個唯一的名字。除非打算用FragmentManager.BackStackEntryAPIs來進行一些高級的fragments操作,這個名字不是必須的。
三、Fragments之間的交互
定義一個接口
為了讓fragment與activity交互,可以在Fragment 類中定義一個接口,并在activity中實現。Fragment在他們生命周期的onAttach()方法中獲取接口的實現,然后調用接口的方法來與Activity交互。
實現接口
為了接收回調事件,宿主activity必須實現在Fragment中定義的接口。
傳消息給Fragment
宿主activity通過findFragmentById()方法獲取fragment的實例,然后直接調用Fragment的public方法來向fragment傳遞消息。
源地址:http://wiki.jikexueyuan.com/project/android-training-geek/communicating.html