學(xué)習(xí)筆記| AS入門(六) 碎片F(xiàn)ragment

安卓自3.0開始引入Fragment的概念痴腌,主要是為了能在不同分辯率屏幕上進(jìn)行更為動(dòng)態(tài)和靈活的UI設(shè)計(jì),讓程序更加合理和充分利用大屏幕空間臼闻。本篇將學(xué)習(xí)Fragment以下幾個(gè)知識(shí)點(diǎn):

  • Fragment概要
  • Fragment生命周期
  • 加載Fragment方法
    • 靜態(tài)加載
    • 動(dòng)態(tài)加載
  • Fragment與Activity之間通信

1.Fragment概要

學(xué)習(xí)Fragment的時(shí)候可以聯(lián)系之前學(xué)習(xí)過(guò)的Activity有巧,因?yàn)樗鼈冇泻芏嘞嗨泣c(diǎn):都可包含布局鹉胖,有自己的生命周期,F(xiàn)ragment可看似迷你活動(dòng)绒尊。正如Fragment的名字--碎片畜挥,它的出現(xiàn)是為了解決Android碎片化 ,它可作為Activity界面的組成部分婴谱,可在Activity運(yùn)行中實(shí)現(xiàn)動(dòng)態(tài)地加入蟹但、移除和交換。一個(gè)Activity中可同時(shí)出現(xiàn)多個(gè)Fragment谭羔,一個(gè)Fragment也可在多個(gè)Activity中使用华糖。活動(dòng)和碎片像極了夫妻瘟裸, 雖然緊密聯(lián)系但是又有獨(dú)立空間客叉,在一起讓彼此變得更好。

下面這個(gè)非常經(jīng)典的例子更直觀地說(shuō)明了Fragment作用:

2.Fragment生命周期

先來(lái)看官方文檔提供的有關(guān)Fragment生命周期的圖片景描。

是不是能發(fā)現(xiàn)Fragment和Activity的生命周期太相似了,現(xiàn)在只需要再介紹幾個(gè)Activity中沒講過(guò)的新方法:

onAttach():當(dāng)Fragment和Activity建立關(guān)聯(lián)時(shí)調(diào)用
onCreateView():當(dāng)Fragment創(chuàng)建視圖時(shí)調(diào)用
onActivityCreated():當(dāng)與Fragment相關(guān)聯(lián)的Activity完成onCreate()之后調(diào)用
onDestroyView():在Fragment中的布局被移除時(shí)調(diào)用
onDetach():當(dāng)Fragment和Activity解除關(guān)聯(lián)時(shí)調(diào)用

在上圖中畫了幾條線秀撇,可以看到Fragment周期中的狀態(tài)幾乎都是成對(duì)出現(xiàn)的超棺,所以不難理解下圖幾種變化下Fragment生命周期方法的調(diào)用順序了。

加載到Activity中的Fragment在各種變化下方法的調(diào)用順序更值得注意呵燕。需要提一句的是棠绘,Activity的FragmentManager負(fù)責(zé)調(diào)用隊(duì)列中Fragment的生命周期方法,只要Fragment的狀態(tài)與Activity的狀態(tài)保持了同步再扭,托管Activity的FragmentManager便會(huì)繼續(xù)調(diào)用其他生命周期方法以繼續(xù)保持Fragment與Activity的狀態(tài)一致氧苍。

Fragment生命周期與Activity生命周期的一個(gè)關(guān)鍵區(qū)別就在于,F(xiàn)ragment的生命周期方法是由托管Activity而不是操作系統(tǒng)調(diào)用的泛范。Activity中生命周期方法都是protected让虐,而Fragment都是public,也能印證了這一點(diǎn)罢荡,因?yàn)锳ctivity需要調(diào)用Fragment那些方法并管理它赡突。

3.加載Fragment方法

現(xiàn)在就來(lái)學(xué)習(xí)如何在Activity中加載Fragment。

(1)靜態(tài)加載:在托管Activity的layout文件中聲明Fragment

靜態(tài)加載Fragment大致過(guò)程如圖区赵,分成四步:

下面通過(guò)一個(gè)簡(jiǎn)單的例子感受Fragment靜態(tài)加載到Activity的過(guò)程惭缰。

第一步:新建frag_layout.xml,為Fragment指定一個(gè)布局笼才,這里簡(jiǎn)單的放一個(gè)TextView和一個(gè)Button漱受。

第二步:新建一個(gè)MyFragment類并繼承Fragment,這里引用android.app包下的就可以骡送,另一個(gè)包下主要用于兼容低版本的安卓系統(tǒng)昂羡。然后重寫onCreateView()方法絮记,這個(gè)方法里通過(guò)LayoutInflater的inflate()方法將剛剛定義的frag_layout布局加載進(jìn)來(lái)并得到一個(gè)View,再return這個(gè)View紧憾。

第三步:新建mian.xml到千,作為Activity的布局,使用< fragment>標(biāo)簽添加碎片赴穗,并且一定要有android:name屬性且值為被加載的Fragment類的包名.類名完整形式憔四。

第四步:在MainActivity中加載main布局。現(xiàn)在MyFragment就完成了靜態(tài)加載到MainActivity中般眉,這時(shí)碎片里的控件自然也是活動(dòng)的一個(gè)部分了赵,可直接在活動(dòng)中獲取到Button的實(shí)例,來(lái)注冊(cè)點(diǎn)擊事件了甸赃。

運(yùn)行一下看看能不能達(dá)到效果:

(2)動(dòng)態(tài)加載:在托管Activity通過(guò)代碼動(dòng)態(tài)添加

動(dòng)態(tài)加載的代碼也非常簡(jiǎn)單柿汛,直接看例子。修改main.xml埠对,將整個(gè)< fragment>刪掉络断。但還保留一個(gè)LinerLayout的空間并且還給了Id,為何這樣做项玛?馬上揭秘貌笨。

接下來(lái)在MainActivity中添加幾行代碼:

可將整個(gè)過(guò)程大致分為三個(gè)步驟:

第一步,先用getFragmentManager()方法獲取一個(gè)FragmentManager對(duì)象襟沮,再通過(guò)它的beginTransaction()獲取一個(gè)FragmentTransaction的實(shí)例锥惋。

第二步,用beginTransaction.add()方法將MyFragemnt實(shí)例添加到main布局里L(fēng)inearLayout里开伏,終于知道之前鋪墊的Id是怎么回事了膀跌。一定要注意,add()方法里的第一個(gè)參數(shù)是容器視圖資源Id固灵,而不是layout捅伤。容器視圖資源Id有兩個(gè)作用:告知FragmentManager,碎片視圖應(yīng)該出現(xiàn)在活動(dòng)視圖的什么地方巫玻;它也是FragmentManager隊(duì)列中碎片的唯一標(biāo)識(shí)符暑认。而靜態(tài)加載時(shí)碎片的唯一標(biāo)識(shí)符正是在活動(dòng)布局里< fragment>下的id。

第三步:調(diào)用beginTransaction.commit()提交大审。另外蘸际,如果允許用戶通過(guò)按下返回按鍵返回到前一個(gè)Fragment狀態(tài),在調(diào)用commit()之前先調(diào)用addToBackStack(true)方法徒扶。

這里注意到動(dòng)態(tài)加載進(jìn)來(lái)的Fragment里的控件并不能直接在活動(dòng)中findViewById得到粮彤,那么如何實(shí)現(xiàn)點(diǎn)擊效果呢,學(xué)完下一個(gè)知識(shí)點(diǎn)就有辦法了。

4.Fragment與Activity之間通信

在活動(dòng)中可以通過(guò)調(diào)用FragmentManagerfindFragmentById()方法來(lái)得到相應(yīng)碎片的實(shí)例导坟,繼而可以調(diào)用碎片里的方法屿良。以上面demo舉例,如果想得到靜態(tài)加載碎片的實(shí)例惫周,可在MainActivity添加代碼如下:

MyFragment myFragment = (MyFragment)getFragmentManager(). findFragmentById(R.id.fragment);

如果想得到動(dòng)態(tài)加載碎片的實(shí)例尘惧,代碼如下:

MyFragment myFragment = (MyFragment)fragmentManager(). findFragmentById(R.id.layout);

在碎片中也可以通過(guò)調(diào)用getActivity()方法來(lái)得到和當(dāng)前碎片相關(guān)聯(lián)的活動(dòng)實(shí)例,這樣調(diào)用活動(dòng)里的方法就變得輕而易舉了递递。比如想在MyFragment得到MainActivity的實(shí)例:

MainActivity activity=(MainActivity)getActivity();

于是碎片和活動(dòng)可以很方便地進(jìn)行通信了喷橙。再想一想碎片和碎片之間如何進(jìn)行通信?先在一個(gè)碎片中可以得到與它相關(guān)聯(lián)的活動(dòng)登舞,然后再通過(guò)這個(gè)活動(dòng)去獲取另外一個(gè)碎片的實(shí)例贰逾,這樣實(shí)現(xiàn)了不同碎片之間的通信了。

現(xiàn)在你有沒有想到解決之前那個(gè)問(wèn)題的辦法呢菠秒?可以這樣做疙剑,修改MyFragment,代碼如下圖所示:

現(xiàn)在按鈕點(diǎn)擊就又有響應(yīng)了践叠!其實(shí)在實(shí)際開發(fā)中言缤,如果某一板塊每次用到都需要相同的功能,就完全可以在碎片中實(shí)現(xiàn)需求禁灼,而不必在活動(dòng)中重復(fù)代碼管挟,這樣可以提高代碼的復(fù)用性。

> 下一篇預(yù)告:數(shù)據(jù)存儲(chǔ)篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匾二,一起剝皮案震驚了整個(gè)濱河市哮独,隨后出現(xiàn)的幾起案子拳芙,更是在濱河造成了極大的恐慌察藐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舟扎,死亡現(xiàn)場(chǎng)離奇詭異分飞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)睹限,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門譬猫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人羡疗,你說(shuō)我怎么就攤上這事染服。” “怎么了叨恨?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵柳刮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)秉颗,這世上最難降的妖魔是什么痢毒? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蚕甥,結(jié)果婚禮上哪替,老公的妹妹穿的比我還像新娘。我一直安慰自己菇怀,他們只是感情好凭舶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敏释,像睡著了一般库快。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钥顽,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天义屏,我揣著相機(jī)與錄音,去河邊找鬼蜂大。 笑死闽铐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奶浦。 我是一名探鬼主播兄墅,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼澳叉!你這毒婦竟也來(lái)了隙咸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤成洗,失蹤者是張志新(化名)和其女友劉穎五督,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓶殃,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡充包,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遥椿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片基矮。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冠场,靈堂內(nèi)的尸體忽然破棺而出家浇,到底是詐尸還是另有隱情,我是刑警寧澤碴裙,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布钢悲,位于F島的核電站灌具,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏譬巫。R本人自食惡果不足惜咖楣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芦昔。 院中可真熱鬧诱贿,春花似錦、人聲如沸咕缎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凭豪。三九已至焙蹭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嫂伞,已是汗流浹背孔厉。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帖努,地道東北人撰豺。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拼余,于是被迫代替她去往敵國(guó)和親污桦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,112評(píng)論 25 707
  • 0 認(rèn)知 Fragment官方的翻譯名為:片段匙监,表示 Activity中的行為或用戶界面部分凡橱。 相比Activit...
    我是Asha閱讀 2,939評(píng)論 2 25
  • Fragment 描述: ??翻譯可以譯為:碎片、片段,Android 3.0開始引入fragments 的概念亭姥;...
    Lost_Robot閱讀 1,694評(píng)論 0 11
  • 引言:這篇文章致份,大概分析下Fragment的生命周期变抽、實(shí)際應(yīng)用方法以及使用Fragment時(shí)需要注意的地方础拨,算是F...
    androidjp閱讀 12,880評(píng)論 10 104
  • 凌晨十二點(diǎn)氮块,準(zhǔn)備入睡時(shí)。手機(jī)顯示一條短信诡宗。打開一看是陪伴自己從小到大的好友夢(mèng)晨滔蝉。發(fā)來(lái)的語(yǔ)音中陸陸續(xù)續(xù)的哭泣聲夾雜著...
    愛笑的江同學(xué)閱讀 484評(píng)論 3 6