先來(lái)一副Fragment生命周期的圖解:
OnAttach()
作用:幫助Fragment與Activity進(jìn)行交互。
Activity傳入Fragment:
public void onAttach(Activity activity) {
super.onAttach(activity);
titles = ((MainActivity) activity).getTitles();//通過(guò)強(qiáng)轉(zhuǎn)成宿主activity疯趟,就可以獲取到傳遞過(guò)來(lái)的數(shù)據(jù)
}
Fragment把值傳遞給Activity,可以時(shí)候接口回調(diào)。
1)在Fragment中定義接口拷姿。
2)在Activity中實(shí)現(xiàn)接口蜗帜。
3)在OnAttach中獲取Activity實(shí)例献汗,然后調(diào)用實(shí)現(xiàn)了的接口。
兩個(gè)Fragment通信王污,通常為兩個(gè)Fragment都綁定同一個(gè)Activity罢吃,可以使用Activity作為中介。
onCreate()
系統(tǒng)創(chuàng)建fragment的時(shí)候回調(diào)他昭齐,可以在其中初始化除了view之外的東西尿招,例如實(shí)例化一些變量
通常這些變量是當(dāng)Fragment暫停或停止時(shí)需要保存的變量阱驾。
如果我們要為Fragment啟動(dòng)一個(gè)后臺(tái)線程就谜,可以考慮將代碼放于此處。
參數(shù)是:Bundle savedInstance, 用于保存 Fragment 參數(shù), Fragement 也可以 重寫(xiě) onSaveInstanceState(BundleoutState) 方法, 保存Fragement狀態(tài);
可以用于 文件保護(hù)
他只調(diào)用一次里覆。
onCreateView()
第一次使用的時(shí)候 fragment會(huì)在這上面畫(huà)一個(gè)layout出來(lái)丧荐, 為了可以畫(huà)控件 要返回一個(gè) 布局的view,也可以返回null喧枷。
當(dāng)系統(tǒng)用到fragment的時(shí)候 fragment就要返回他的view虹统,越快越好 ,所以盡量在這里不要做耗時(shí)操作隧甚,比如從數(shù)據(jù)庫(kù)加載大量數(shù)據(jù)顯示listview车荔,
當(dāng)然線程還是可以的。
給當(dāng)前的fragment繪制ui布局戚扳,可以使用線程更新UI忧便,說(shuō)白了就是加載fragment的布局的。
這里一般都先判斷是否為null帽借。
if(text==null){
Bundle args=getArguments();
text=args.getString("text");
}
if (view == null) {
view = inflater.inflate(R.layout.hello, null);
}
onActivityCreated()
當(dāng)Activity中的onCreate方法執(zhí)行完后調(diào)用珠增。
注意了:
從這句官方的話可以看出:當(dāng)執(zhí)行onActivityCreated()的時(shí)候 activity的
onCreate才剛完成。
所以在onActivityCreated()調(diào)用之前 activity的onCreate可能還沒(méi)有完成宜雀,
所以不能再onCreateView()中進(jìn)行 與activity有交互的UI操作切平,UI交互操作可以在onActivityCreated()里面進(jìn)行。
所以呢:這個(gè)方法主要是初始化那些你需要你的父Activity或者Fragment的UI已經(jīng)被完
整初始化才能初始化的元素辐董。
如果在onCreateView里面初始化空間 會(huì)慢很多悴品,比如listview等。
onStart()
和activity一致简烘,啟動(dòng)Fragement 啟動(dòng)時(shí)回調(diào),苔严,此時(shí)Fragement可見(jiàn)。
onResume()
和activity一致 在activity中運(yùn)行是可見(jiàn)的孤澎。激活, Fragement 進(jìn)入前臺(tái), 可獲取焦點(diǎn)時(shí)激活届氢。
onPause()
和activity一致 其他的activity獲得焦點(diǎn),這個(gè)仍然可見(jiàn)
第一次調(diào)用的時(shí)候覆旭,指的是 用戶 離開(kāi)這個(gè)fragment(并不是被銷(xiāo)毀)
通常用于 用戶的提交(可能用戶離開(kāi)后不會(huì)回來(lái)了)
onStop()
和activity一致退子, fragment不可見(jiàn)的岖妄, 可能情況:activity被stopped了OR fragment被移除但被,加入到回退棧中寂祥,一個(gè)stopped的fragment仍然是活著的如果長(zhǎng)時(shí)間不用也會(huì)被移除荐虐。
onDestroyView()
Fragment中的布局被移除時(shí)調(diào)用。
表示fragemnt銷(xiāo)毀相關(guān)聯(lián)的UI布局丸凭, 清除所有跟視圖相關(guān)的資源福扬。
以前以為這里沒(méi)什么用處其實(shí) 大有文章可做,
相信大家都用過(guò)ViewPager+Fragment惜犀,由于ViewPager的緩存機(jī)制铛碑,每次都會(huì)加載3
頁(yè)。
例如:有四個(gè) fragment 當(dāng)滑動(dòng)到第四頁(yè)的時(shí)候 第一頁(yè)執(zhí)行onDestroyView(),但沒(méi)有
執(zhí)行onDestroy虽界。他依然和activity關(guān)聯(lián)汽烦。當(dāng)在滑動(dòng)到第一頁(yè)的時(shí)候又執(zhí)行了
onCreateView()。 生命周期可以自己試一下浓恳。
那么問(wèn)題來(lái)了刹缝。會(huì)出現(xiàn)重復(fù)加載view的局面,所以這么做(下面是先人的代碼)
@Override
public void onDestroyView() {
Log.i("onDestroyView_Fragment");
if(view!=null){
((ViewGroup)view.getParent()).removeView(view);
}
super.onDestroyView();
}
onDestroy()
銷(xiāo)毀fragment對(duì)象颈将, 跟activity類(lèi)似了梢夯。
onDetach()
Fragment和Activity解除關(guān)聯(lián)的時(shí)候調(diào)用。 脫離activity晴圾。