《Fragment的一些整理》

Fragment是嵌套入Activity的片段,比Activity要更為輕巧靈活,但是用起來也會(huì)相對(duì)比較麻煩一些莱找。之前在學(xué)習(xí)Fragment和實(shí)際開發(fā)中遇到一些Fragment的問題,所以就這些問題進(jìn)行了整理赦颇。

一、Fragment的初始化

Google源碼中一般采用newInstance的靜態(tài)方法來新建一個(gè)fragment赴涵,建議用setArgument的方式來傳遞參數(shù)媒怯,將所需的參數(shù)直接暴露出來,方便一起開發(fā)的同事知道需要傳什么數(shù)據(jù)髓窜。


二扇苞、屏幕旋轉(zhuǎn)帶來的問題

1、配置如下屬性寄纵,限制Fragment托管的Activity旋轉(zhuǎn)

<activity android:name= ".MainActivity"

? android:configChanges = "orientation|screenSize">

2鳖敷、保留Fragment

用setRetainInstance(true)方法保留fragment實(shí)例。fragment的retainInstance屬性值默認(rèn)是false程拭,表明fragment默認(rèn)不會(huì)被保留定踱。在屏幕旋轉(zhuǎn)時(shí),fragment的托管activity會(huì)被銷毀重建哺壶,F(xiàn)ragmentManager會(huì)銷毀隊(duì)列中的fragment視圖屋吨,接著會(huì)檢查retainInstance屬性,如果屬性是false(默認(rèn)值)山宾,F(xiàn)ragmentManager就會(huì)銷毀該fragment至扰。如果為true,該fragment的視圖會(huì)被銷毀资锰,fragment本身并不銷毀敢课,新的FragmentManager會(huì)找到它,并給他創(chuàng)建新視圖绷杜。但是直秆,如果系統(tǒng)因?yàn)閮?nèi)存不足而銷毀了托管的Activity,被保留的Fragment也會(huì)被銷毀鞭盟。


3圾结、savedInstanceState

在Activity中我們可以通過onSaveInstanceState()方法和onRestoreInstanceState()方法實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)。

Fragment的保存機(jī)制和Activity類似齿诉,不過FragmentmyonRestoreInstanceState()方法筝野,需要在onActivityCreated()中實(shí)現(xiàn)。

4粤剧、View的保存

在視圖被銷毀之后如果想要保存View的state歇竟,需要實(shí)現(xiàn)onSaveInstanceState()方法和onRestoreInstanceState()方法。安卓自帶的View一般已經(jīng)實(shí)現(xiàn)了這個(gè)方法抵恋,開發(fā)者在使用的時(shí)候只需要添加android:freezeText=”true”屬性焕议。

關(guān)于Fragment的保存,一篇外國(guó)博文做了較為詳細(xì)的介紹弧关。The Real Best Practices to Save/Restore Activity's and Fragment's state. (StatedFragment is now deprecated)

三盅安、FragmentTransaction 的 add和remove唤锉、show和hide、replace的使用

transaction.add()

往Activity中添加一個(gè)Fragment

transaction.remove()

從Activity中移除一個(gè)Fragment宽堆,如果被移除的Fragment在沒有添加到回退棧的情況下,這個(gè)Fragment實(shí)例將會(huì)被銷毀腌紧。

transaction.replace()

使用另一個(gè)Fragment替換當(dāng)前的。

transaction.hide()

隱藏當(dāng)前的Fragment

transaction.show()

顯示之前隱藏的Fragment

替換fragment

使用replace切換:

使用replace切換回調(diào)用一下2段life cycle

05-08 07:44:30.554 2864-2864/? D/_Albert: FirstFragment:onAttch

05-08 07:44:30.554 2864-2864/? D/_Albert: FirstFragment:onCreate

05-08 07:44:30.554 2864-2864/? D/_Albert: FirstFragment:onCreateView

05-08 07:44:30.561 2864-2864/? D/_Albert: FirstFragment:onActivityCreated

05-08 07:44:30.561 2864-2864/? D/_Albert: FirstFragment:onStart

05-08 07:44:30.561 2864-2864/? D/_Albert: FirstFragment:onResume



05-08 07:44:43.010 2864-2864/? D/_Albert: FirstFragment:onPause

05-08 07:44:43.011 2864-2864/? D/_Albert: FirstFragment:onStop

05-08 07:44:43.011 2864-2864/? D/_Albert: FirstFragment:onDestoryView

05-08 07:44:43.011 2864-2864/? D/_Albert: FirstFragment:onDestory

05-08 07:44:43.011 2864-2864/? D/_Albert: FirstFragment:onDetach

05-08 07:44:43.011 2864-2864/? D/_Albert: ReplaceFragment:onAttch

05-08 07:44:43.011 2864-2864/? D/_Albert: ReplaceFragment:onCreate

05-08 07:44:43.011 2864-2864/? D/_Albert: ReplaceFragment:onCreateView

05-08 07:44:43.015 2864-2864/? D/_Albert: ReplaceFragment:onActivityCreated

05-08 07:44:43.015 2864-2864/? D/_Albert: ReplaceFragment:onStart

05-08 07:44:43.016 2864-2864/? D/_Albert: ReplaceFragment:onResume

也就是說畜隶,replace會(huì)remove掉之前的fragment壁肋,再將替換fragment,add進(jìn)去籽慢。

使用add浸遗、show、hide切換:

life cycle 如下:

05-08 08:16:44.818 3740-3740/? D/_Albert: FirstFragment:onAttch

05-08 08:16:44.819 3740-3740/? D/_Albert: FirstFragment:onCreate

05-08 08:16:44.819 3740-3740/? D/_Albert: FirstFragment:onCreateView

05-08 08:16:44.824 3740-3740/? D/_Albert: FirstFragment:onActivityCreated

05-08 08:16:44.825 3740-3740/? D/_Albert: FirstFragment:onStart

05-08 08:16:44.825 3740-3740/? D/_Albert: FirstFragment:onResume

05-08 08:16:55.383 3740-3740/? D/_Albert: SecondFragmentonAttch

05-08 08:16:55.383 3740-3740/? D/_Albert: SecondFragmentonCreate

05-08 08:16:55.383 3740-3740/? D/_Albert: SecondFragmentonCreateView

05-08 08:16:55.384 3740-3740/? D/_Albert: SecondFragment:onActivityCreated

05-08 08:16:55.384 3740-3740/? D/_Albert: SecondFragment:onStart

05-08 08:16:55.384 3740-3740/? D/_Albert: SecondFragment:onResume

以上生命周期的對(duì)比表明replace方法會(huì)remove之前的fragment箱亿,而用add搭配hide方法只是將之前的fragment做一個(gè)隱藏跛锌,并不會(huì)觸發(fā)他的life cycle。在實(shí)際開發(fā)中届惋,如果要保留一面用戶操作界面的建議不要采用replace方法去切換髓帽。

四、getActivity為null的坑

Fragment中的Context的我們一般利用getActivity()來獲取托管的Activity()作為Context使用脑豹。

而getActivity有時(shí)會(huì)null郑藏。

一種做法是保持對(duì)Activity的引用。

@Override

public voidonAttach(Activity activity) {

super.onAttach(activity);

mContext= activity;

}

getActivity()==null一般出現(xiàn)在Fragment和Activity沒有關(guān)聯(lián)的情況瘩欺。較為穩(wěn)妥的做法是找到?jīng)]關(guān)聯(lián)的原因必盖。如果確定已經(jīng)onAttach()過了,問題大多出現(xiàn)在onDetach()里面俱饿。原因可能是托管的Activity已經(jīng)被銷毀歌粥。或者Fragment的實(shí)例被刪去之后View沒有被賦值mContainerView拍埠,導(dǎo)致UI一直在失驶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市枣购,隨后出現(xiàn)的幾起案子嬉探,更是在濱河造成了極大的恐慌,老刑警劉巖坷虑,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甲馋,死亡現(xiàn)場(chǎng)離奇詭異埂奈,居然都是意外死亡迄损,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門账磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芹敌,“玉大人痊远,你說我怎么就攤上這事∈侠蹋” “怎么了碧聪?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)液茎。 經(jīng)常有香客問我逞姿,道長(zhǎng),這世上最難降的妖魔是什么捆等? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任滞造,我火速辦了婚禮,結(jié)果婚禮上栋烤,老公的妹妹穿的比我還像新娘谒养。我一直安慰自己,他們只是感情好明郭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布买窟。 她就那樣靜靜地躺著,像睡著了一般薯定。 火紅的嫁衣襯著肌膚如雪始绍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天沉唠,我揣著相機(jī)與錄音疆虚,去河邊找鬼。 笑死满葛,一個(gè)胖子當(dāng)著我的面吹牛径簿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘀韧,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼篇亭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了锄贷?” 一聲冷哼從身側(cè)響起译蒂,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谊却,沒想到半個(gè)月后柔昼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炎辨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年捕透,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乙嘀,死狀恐怖末购,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虎谢,我是刑警寧澤盟榴,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站婴噩,受9級(jí)特大地震影響擎场,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜几莽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一顶籽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧银觅,春花似錦礼饱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洒忧,卻和暖如春蝴韭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熙侍。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工榄鉴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛉抓。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓庆尘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親巷送。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驶忌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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