#Fragment基礎(chǔ)及注意點

引言


A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and which you can add or remove while the activity is running (sort of like a "sub activity" that you can reuse in different activities).

一個碎片代表在時間中的一種行為或者一部分的用戶交互挂捻,你可以在一個單一的活動(activity)中,組合復(fù)雜的碎片形成一個復(fù)合UI,并可以重復(fù)使用碎片在多個活動中.你可以將碎片想象成活動的一個組件,它有自己的生命周期,獲得到它自己的輸入事件碉纺,并且你可以添加或者移除碎片當(dāng)活動正在運行(有些類似活動的下級,可以在不同的活動中進行重復(fù)使用).

生命周期


fragment有它自己的生命周期刻撒,所以我們先來分析下生命周期.

fragment_lifecycle.png
  • onAttach(Activity)

    called once the fragment is associated with its activity.

    當(dāng)fragment和activity建立關(guān)系的時候調(diào)用

  • onCreate(Bundle)

    called to do initial creation of the fragment.

    調(diào)用初始化創(chuàng)建fragment

  • onCreateView(LayoutInflater, ViewGroup, Bundle)

    creates and returns the view hierarchy associated with the fragment.

    創(chuàng)建和返回與fragment相關(guān)的布局骨田。

  • onActivityCreated(Bundle)

    tells the fragment that its activity has completed its own Activity.onCreate().

    告知fragment activity已經(jīng)完成它的生命周期中onCreate這一步。

  • onViewStateRestored(Bundle)

    tells the fragment that all of the saved state of its view hierarchy has been restored.

    告知fragment 布局的所有存儲狀態(tài)都已經(jīng)恢復(fù)声怔。即這里就是取出存儲到Bundle中的數(shù)據(jù).

  • onStart()

    makes the fragment visible to the user (based on its containing activity being started).

    使得fragment對于用戶可見(這是基于包含碎片的activity可見的情況下).在這種情況下用戶只能看到視圖态贤,但是不能進行交互。

  • onResume()

    makes the fragment begin interacting with the user (based on its containing activity being resumed).

    使得碎片開始和用戶進行交互(基于包含碎片的activity也開始交互的情況下)

  • onPause()

    fragment is no longer interacting with the user either because its activity is being paused or a fragment operation is modifying it in the activity.

    碎片不再和用戶交互醋火,可能是activity進入paused狀態(tài)(activity進入半透明悠汽,半遮蓋的狀態(tài)),或者碎片被移除或者替代芥驳。

  • onStop()

    fragment is no longer visible to the user either because its activity is being stopped or a fragment operation is modifying it in the activity.

    碎片不再對用戶可見柿冲,因為activity進stopped狀態(tài)(activity對用戶也不可見),或者fragment被移除在當(dāng)前activity中兆旬。

  • onDestroyView()

    allows the fragment to clean up resources associated with its View.

    fragment清除和視圖有關(guān)的資源姻采。

  • onDestroy()

    called to do final cleanup of the fragment's state.

    對碎片狀態(tài)的最后清理。

  • onDetach()

    called immediately prior to the fragment no longer being associated with its activity.

    通知fragment和當(dāng)前activity解除關(guān)系爵憎。

  • 大致分為以下過程:

    1. 創(chuàng)建過程:onAttach->onCreate->onCreateView->onActivityCreated
    2. 可見化過程:onStart->onResume
    3. 后臺過程:onPause->onStop
    4. 銷毀過程:onDestoryView->onDestory->onDetach

按照生命周期的順序執(zhí)行慨亲。

注意:如上圖生命周期圖,用戶將程序放在后臺運行或者進入堆棧宝鼓,切換到其他視圖刑棵,就會執(zhí)行onPause->onStop.這兩個操作就是針對可視化到不可視化做出的響應(yīng)。

Back Stack


關(guān)于fragment的回退椨拚。可以看我的這篇文章.

狀態(tài)的恢復(fù)和存儲


方法

  • onSaveInstanceState(Bundle outState)

    這是用來儲存狀態(tài)的蛉签,比如成員變量等等胡陪,但是不需要手動存儲視圖數(shù)據(jù),因為android機制中View自動存儲恢復(fù)碍舍,如果你只想恢復(fù)視圖只需要實現(xiàn)這個方法柠座。
  • onActivityCreated(Bundle)

首先我們要知道fragment中沒有和activity 一樣的onRestoreInstanceState方法進行狀態(tài)恢復(fù),所以我們一般在onActivityCreated進行狀態(tài)恢復(fù),當(dāng)然onCreate()片橡,onCreateView都可以妈经。

onSaveInstanceState調(diào)用:

  • This corresponds to Activity.onSaveInstanceState(Bundle) and most of the discussion there applies here as well. Note however: this method may be called at any time before onDestroy(). There are many situations where a fragment may be mostly torn down (such as when placed on the back stack with no UI showing), but its state will not be saved until its owning activity actually needs to save its state.

  • 和activity的onSaveInstanceState(Bundle)相當(dāng)。這個方法可能被調(diào)用在onDestory()之前的許多時機捧书,例如進入后臺吹泡,但是只有當(dāng)activity真的需要保存狀態(tài)的時候才會調(diào)用。

  • 也就是說當(dāng)進入后臺過程(onPause->onStop->onDestoryView),都有可能調(diào)用onSaveInstanceState保存狀態(tài)经瓷,但是只有真的需要保存狀態(tài)的時候才會調(diào)用爆哑。我們來列舉下不需要調(diào)用的情況:

    1. fragmentB返回A,此時不會調(diào)用B的onSaveInstanceState方法舆吮,因為B不需要被恢復(fù)揭朝。
    2. 當(dāng)B在A之后被創(chuàng)建,如果在B的生存期間A并沒有被銷毀的話色冀,那么系統(tǒng)可能并不會調(diào)用A的onSaveInstanceState方法潭袱,因為這個時候的A仍然是完整的。
  • 當(dāng)然在旋轉(zhuǎn)和跳轉(zhuǎn)的時候都會進行調(diào)用呐伞。

注意點:onSaveInstanceState中你只需要保存一些變量敌卓,即狀態(tài)的保存慎式。不需要存儲視圖資源伶氢,因為android View中已經(jīng)自動實現(xiàn)了存儲恢復(fù)機制,你只需要聲明了onSaveInstanceState方法瘪吏,View會自動在需要的時候進行存儲和恢復(fù)癣防。

getChildFragmentManager


  • fragment中用getChildFragmentManager來管理fragment所嵌套的fragment。
  • 所以對fragment進行管理有兩種掌眠,一種是在activity中對fragment進行管理蕾盯,一種是在fragment中管理嵌套的fragment.

總結(jié)


  • fragment幾個重要概念:生命周期,堆棧管理蓝丙,存儲恢復(fù)级遭。
  • 多實踐,理解會更加深刻渺尘。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挫鸽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸥跟,更是在濱河造成了極大的恐慌丢郊,老刑警劉巖盔沫,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枫匾,居然都是意外死亡架诞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門干茉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谴忧,“玉大人,你說我怎么就攤上這事等脂∏温” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵上遥,是天一觀的道長搏屑。 經(jīng)常有香客問我,道長粉楚,這世上最難降的妖魔是什么辣恋? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮模软,結(jié)果婚禮上伟骨,老公的妹妹穿的比我還像新娘。我一直安慰自己燃异,他們只是感情好携狭,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著回俐,像睡著了一般逛腿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仅颇,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天单默,我揣著相機與錄音,去河邊找鬼忘瓦。 笑死搁廓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耕皮。 我是一名探鬼主播境蜕,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凌停!你這毒婦竟也來了粱年?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤苦锨,失蹤者是張志新(化名)和其女友劉穎逼泣,沒想到半個月后趴泌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡拉庶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年嗜憔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氏仗。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡吉捶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出皆尔,到底是詐尸還是另有隱情呐舔,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布慷蠕,位于F島的核電站珊拼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏流炕。R本人自食惡果不足惜澎现,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望每辟。 院中可真熱鬧剑辫,春花似錦、人聲如沸渠欺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挠将。三九已至胳岂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捐名,已是汗流浹背旦万。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工闹击, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镶蹋,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓赏半,卻偏偏與公主長得像贺归,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子断箫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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