Android基礎(chǔ)-Fragment

Google Doc: https://developer.android.google.cn/guide/components/fragments

一屈糊、Fragment生命周期

fragment_lifecycle.png

Activity對(duì)Fragment生命周期的影響

activity_fragment_lifecycle.png
  • onAttach()
    在 Fragment 已與 Activity 關(guān)聯(lián)時(shí)調(diào)用(Activity 傳遞到此方法內(nèi))。
  • onCreateView()
    調(diào)用它可創(chuàng)建與 Fragment 關(guān)聯(lián)的視圖層次結(jié)構(gòu)。
  • onActivityCreated()
    在 Activity 的 onCreate() 方法已返回時(shí)調(diào)用返帕。
  • onDestroyView()
    在移除與 Fragment 關(guān)聯(lián)的視圖層次結(jié)構(gòu)時(shí)調(diào)用钻洒。
  • onDetach()
    在取消 Fragment 與 Activity 的關(guān)聯(lián)時(shí)調(diào)用。
  • 一旦 Activity 達(dá)到 Resume 狀態(tài)石挂,就可以隨意向 Activity 添加/移除其中的 Fragment 崔泵。 因此秒赤,只有當(dāng) Activity 處于恢復(fù)狀態(tài)時(shí), Fragment 的生命周期才能獨(dú)立變化憎瘸。
  • 當(dāng) Activity 離開 Resume 狀態(tài)時(shí)入篮, Fragment 會(huì)在 Activity 的推動(dòng)下再次經(jīng)歷其生命周期。

與 Activity 一樣幌甘,假使 Activity 的進(jìn)程被終止潮售,而又需要在重建 Activity 時(shí)恢復(fù) Fragment 狀態(tài),可以使用 Bundle 保留 Fragment 的狀態(tài)锅风∷址蹋可以在 Fragment 的 onSaveInstanceState() 回調(diào)期間保存狀態(tài),并可在 onCreate()皱埠、onCreateView() 或 onActivityCreated() 期間恢復(fù)狀態(tài)肮帐。

Activity 生命周期與 Fragment 生命周期之間的最顯著差異在于它們?cè)谄涓髯苑祷貤V械拇鎯?chǔ)方式。默認(rèn)情況下边器,Activity 停止時(shí)會(huì)被放入由系統(tǒng)管理的 Activity 返回棧(以便用戶通過“返回”按鈕回退到 Activity训枢,不過托修,僅當(dāng)在移除 Fragment 的事務(wù)執(zhí)行期間通過調(diào)用 addToBackStack() 顯式請(qǐng)求保存實(shí)例時(shí),系統(tǒng)才會(huì)將 Fragment 放入由宿主 Activity 管理的返回棧肮砾。


二诀黍、基本概念

Fragment核心類
  • Fragment:Fragment的基類袋坑,任何創(chuàng)建的Fragment都需要繼承該類仗处。
  • FragmentManager:管理和維護(hù)Fragment的抽象類,具體的實(shí)現(xiàn)類是- FragmentManagerImpl枣宫。
  • FragmentTransaction:對(duì)Fragment的添加婆誓、刪除等操作都需要通過事務(wù)方式進(jìn)行。是抽象類也颤,具體的實(shí)現(xiàn)類是BackStackRecord洋幻。
  • Nested Fragment:Fragment內(nèi)部嵌套Fragment的能力,Android 4.2提出的翅娶,support-fragment庫可以兼容到1.6文留。
  • 通過getChildFragmentManager()能夠獲得管理子Fragment的FragmentManager,在子Fragment中可以通過getParentFragment()獲得父Fragment竭沫。
衍生類
  • DialogFragment
    顯示浮動(dòng)對(duì)話框燥翅。使用此類創(chuàng)建對(duì)話框可有效地替代使用 Activity 類中的對(duì)話框幫助程序方法,可以將 Fragment 對(duì)話框納入由 Activity 管理的 Fragment 返回棧蜕提,從而使用戶能夠返回清除的 Fragment森书。
    即使旋轉(zhuǎn)屏幕,也能保留對(duì)話框狀態(tài)谎势。
    如果要自定義對(duì)話框樣式凛膏,只需要繼承DialogFragment,并重寫onCreateView()脏榆,該方法返回對(duì)話框UI猖毫。

  • ListFragment
    顯示由適配器(如 SimpleCursorAdapter)管理的一系列項(xiàng)目,類似于 ListActivity须喂。它提供了幾種管理列表視圖的方法鄙麦,如用于處理點(diǎn)擊事件的 onListItemClick() 回調(diào)。

  • PreferenceFragment
    以列表形式顯示 Preference 對(duì)象的層次結(jié)構(gòu)镊折,類似于 PreferenceActivity胯府。可以用來創(chuàng)建“設(shè)置” 頁面恨胚。


三骂因、Fragment通信

1 Fragment向Activity傳遞數(shù)據(jù)

實(shí)現(xiàn)步驟:

  1. 在Fragment中定義接口,并在Activity中實(shí)現(xiàn)該接口赃泡;
  2. 將實(shí)現(xiàn)注入Fragment寒波;
  3. Fragment中調(diào)用接口方法乘盼。

2 Activity向Fragment傳遞數(shù)據(jù)

實(shí)現(xiàn)步驟:
獲取Fragment對(duì)象,并調(diào)用Fragment的方法即可俄烁,如setXXX(XXX xxx)方法绸栅。

3 Fragment之間通信

Fragment之間是沒有任何依賴關(guān)系的,如果要進(jìn)行Fragment之間的通信页屠,需通過Activity作為中介粹胯,不要Fragment之間直接通信。

可使用EventBus


四辰企、Fragment懶加載

懶加載:當(dāng)Fragment完全可見的時(shí)候才去加載數(shù)據(jù)风纠。
主要用在ViewPager+Fragment場景下。

原因:

Fragment放在ViewPager里面時(shí)牢贸,ViewPager會(huì)預(yù)先加載左右相鄰的頁面竹观,但是很多時(shí)候我們也許只會(huì)去看第一個(gè),不會(huì)去看第二個(gè)潜索,如果這時(shí)候不實(shí)現(xiàn)Fragment的懶加載臭增,就會(huì)多余加載一些數(shù)據(jù),造成用戶多消耗流量竹习,所以建議采取懶加載的方式誊抛。

實(shí)現(xiàn)方式:

主要依賴Fragment的setUserVisibleHint(boolean isVisible)方法,此方法會(huì)在 onCreateView()之前執(zhí)行由驹。
當(dāng)Fragment變?yōu)榭梢姇r(shí)芍锚,會(huì)調(diào)用setUserVisibleHint(true);當(dāng)Fragment變?yōu)椴豢梢姇r(shí)蔓榄,會(huì)調(diào)用setUserVisibleHint(false)并炮。
使用getUserVisibleHint()可以獲取Fragment是否可見狀態(tài)。

示例:

以下示例引用自 https://blog.csdn.net/vic6329063/article/details/82838430

Fragment懶加載.png
  • 添加 isPrepared 參數(shù)甥郑。在系統(tǒng)調(diào)用onActivityCreated時(shí)設(shè)置為true逃魄,這時(shí)onCreateView方法已調(diào)用完畢(一般我們?cè)谶@方法里執(zhí)行findViewById等方法),確保 onLazyLoad()方法不會(huì)報(bào)空指針異常澜搅。
  • 添加 isLazyLoaded 參數(shù)伍俘。確保ViewPager來回切換時(shí)BaseFragment的initData方法不會(huì)被重復(fù)調(diào)用,onLazyLoad在該Fragment的整個(gè)生命周期只調(diào)用一次勉躺,第一次調(diào)用onLazyLoad()方法后馬上執(zhí)行 isLazyLoaded = true癌瘾。
  • getUserVisibleHint()會(huì)返回是否可見狀態(tài),這是Fragment實(shí)現(xiàn)懶加載的關(guān)鍵饵溅,只有Fragment 可見才會(huì)調(diào)用onLazyLoad() 加載數(shù)據(jù)妨退。

五、對(duì)Fragment的信息采集

SDK提供不同接口,分別對(duì)應(yīng)Fragment的各個(gè)生命周期咬荷,進(jìn)而采集信息冠句。使用時(shí),需要用戶在Fragment的生命周期的各個(gè)環(huán)節(jié)中幸乒,調(diào)用對(duì)應(yīng)的接口懦底。
使用比較麻煩。

解決方法:

封裝一個(gè)Fragment的子類罕扎,在子類中按照上述方法采集信息聚唐,開發(fā)時(shí)各Fragment直接繼承這個(gè)子類。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壳影,一起剝皮案震驚了整個(gè)濱河市拱层,隨后出現(xiàn)的幾起案子弥臼,更是在濱河造成了極大的恐慌宴咧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件径缅,死亡現(xiàn)場離奇詭異掺栅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纳猪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門氧卧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氏堤,你說我怎么就攤上這事沙绝。” “怎么了鼠锈?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵闪檬,是天一觀的道長。 經(jīng)常有香客問我购笆,道長粗悯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任同欠,我火速辦了婚禮样傍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铺遂。我一直安慰自己衫哥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布襟锐。 她就那樣靜靜地躺著撤逢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笛质,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天泉沾,我揣著相機(jī)與錄音,去河邊找鬼妇押。 笑死跷究,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敲霍。 我是一名探鬼主播俊马,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肩杈!你這毒婦竟也來了柴我?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤扩然,失蹤者是張志新(化名)和其女友劉穎艘儒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夫偶,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡界睁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兵拢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翻斟。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖说铃,靈堂內(nèi)的尸體忽然破棺而出访惜,到底是詐尸還是另有隱情,我是刑警寧澤腻扇,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布债热,位于F島的核電站,受9級(jí)特大地震影響衙解,放射性物質(zhì)發(fā)生泄漏阳柔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一蚓峦、第九天 我趴在偏房一處隱蔽的房頂上張望舌剂。 院中可真熱鬧,春花似錦暑椰、人聲如沸霍转。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽避消。三九已至低滩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岩喷,已是汗流浹背恕沫。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纱意,地道東北人婶溯。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像偷霉,于是被迫代替她去往敵國和親迄委。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容