淺談Android App開發(fā)中Fragment的創(chuàng)建與生命周期
Fragment是activity的界面中的一部分或一種行為。你可以把多個(gè)Fragment們組合到一個(gè)activity中來創(chuàng)建一個(gè)多面界面并且你可以在多個(gè)activity中重用一個(gè)Fragment。你可以把Fragment認(rèn)為模塊化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity運(yùn)行時(shí)被添加或刪除。
Fragment不能獨(dú)立存在,它必須嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影響。例如:當(dāng)activity暫停時(shí),它擁有的所有的Fragment們都暫停了,當(dāng)activity銷毀時(shí),它擁有的所有Fragment們都被銷毀。然而,當(dāng)activity運(yùn)行時(shí)(在onResume()之后,onPause()之前),你可以單獨(dú)地操作每個(gè)Fragment,比如添加或刪除它們。當(dāng)你在執(zhí)行上述針對(duì)Fragment的事務(wù)時(shí),你可以將事務(wù)添加到一個(gè)棧中,這個(gè)棧被activity管理,棧中的每一條都是一個(gè)Fragment的一次事務(wù)。有了這個(gè)棧,就可以反向執(zhí)行Fragment的事務(wù),這樣就可以在Fragment級(jí)支持“返回”鍵(向后導(dǎo)航)。
當(dāng)向activity中添加一個(gè)Fragment時(shí),它須置于ViewGroup控件中,并且需定義Fragment自己的界面。你可以在layoutxml文件中聲明Fragment,元素為:<fragment>;也可以在代碼中創(chuàng)建Fragment,然后把它加入到ViewGroup控件中。然而,F(xiàn)ragment不一定非要放在activity的界面中,它可以隱藏在后臺(tái)為actvitiy工作。
接下來講如何使用fragment,包括fragment在加入activity的后退棧中時(shí)如何保持自己的狀態(tài),如何與activity以及其它fragment們共享事件,如何顯示在activity的動(dòng)作欄,等等。
Android從3.0開始引入fragment,主要是為了支持更動(dòng)態(tài)更靈活的界面設(shè)計(jì),比如在平板上的應(yīng)用。平板機(jī)上擁有比手機(jī)更大的屏幕空間來組合和交互界面組件們。Fragment使你在做那樣的設(shè)計(jì)時(shí),不需應(yīng)付view樹中復(fù)雜的變化。通過把a(bǔ)ctivity的layout分成fragment,你可以在activity運(yùn)行時(shí)改變它的樣子,并且可以在activity的后退棧中保存這些改變。
例如:寫一個(gè)讀新聞的程序,可以用一個(gè)fragment顯示標(biāo)題列表,另一個(gè)fragment顯示選中標(biāo)題的內(nèi)容,這兩個(gè)fragment都在一個(gè)activity上,并排顯示。那么這兩個(gè)fragment都有自己的生命周期并響應(yīng)自己感興趣的事件。于是,不需再像手機(jī)上那樣用一個(gè)activity顯示標(biāo)題列表,用另一個(gè)activity顯示新聞內(nèi)容;現(xiàn)在可以把兩者放在一個(gè)activity上同時(shí)顯示出來。
Fragment必須被寫成可重用的模塊。因?yàn)閒ragment有自己的layout,自己進(jìn)行事件響應(yīng),擁有自己的生命周期和行為,所以你可以在多個(gè)activity中包含同一個(gè)Fragment的不同實(shí)例。這對(duì)于讓你的界面在不同的屏幕尺寸下都能給用戶完美的體驗(yàn)尤其重要。比如你可以在程序運(yùn)行于大屏幕中時(shí)啟動(dòng)包含很多fragment的activity,而在運(yùn)行于小屏幕時(shí)啟動(dòng)一個(gè)包含少量fragment的activity。
舉個(gè)例子--還是剛才那個(gè)讀新聞的程序-當(dāng)你檢測(cè)到程序運(yùn)行于大屏幕時(shí),啟動(dòng)activityA,你將標(biāo)題列表和新聞內(nèi)容這兩個(gè)fragment都放在activityA中;當(dāng)檢測(cè)到程序運(yùn)行于小屏幕時(shí),還是啟動(dòng)activityA,但此時(shí)A中只有標(biāo)題列表fragment,當(dāng)選中一個(gè)標(biāo)題時(shí),activityA啟動(dòng)activityB,B中含有新聞內(nèi)容fragment。
Fragments的生命周期
每一個(gè)fragments 都有自己的一套生命周期回調(diào)方法和處理自己的用戶輸入事件。 對(duì)應(yīng)生命周期可參考下圖:
創(chuàng)建片元(Creating a Fragment)
要?jiǎng)?chuàng)建一個(gè)fragment,必須創(chuàng)建一個(gè)fragment的子類(或是繼承自它的子類)。fragment類的代碼看起來很像activity。它與activity一樣都有回調(diào)函數(shù),例如onCreate(),onStart(),onPause(),和onStop()。事實(shí)上,如果你正在將一個(gè)現(xiàn)成的Android應(yīng)用轉(zhuǎn)而使用Fragment來實(shí)現(xiàn),可以簡(jiǎn)單的將代碼從activity的回調(diào)函數(shù)移植到各自的fragment回調(diào)函數(shù)中。
一般情況下,你至少需要實(shí)現(xiàn)以下幾個(gè)生命周期方法:
onCreate()
在創(chuàng)建fragment時(shí)系統(tǒng)會(huì)調(diào)用此方法。在實(shí)現(xiàn)代碼中,你可以初始化想要在fragment中保持的那些必要組件(這里的組件是指除了view之外的東西,比如需要進(jìn)行界面展示的關(guān)鍵數(shù)據(jù)),當(dāng)fragment處于暫停或者停止?fàn)顟B(tài)之后可重新啟用它們。
onCreateView()
在第一次為fragment繪制用戶界面時(shí)系統(tǒng)會(huì)調(diào)用此方法。為fragment繪制用戶界面,這個(gè)函數(shù)必須要返回所繪出的fragment的根View。如果fragment沒有用戶界面可以返回空。
onPause()
系統(tǒng)回調(diào)用該函數(shù)作為用戶離開fragment的第一個(gè)預(yù)兆(盡管這并不總意味著fragment被銷毀)。在當(dāng)前用戶會(huì)話結(jié)束之前,通常要在這里提交任何應(yīng)該持久化的變化(因?yàn)橛脩艨赡懿辉俜祷兀?/p>
大部分應(yīng)用程序都應(yīng)該至少為每個(gè)fragment實(shí)現(xiàn)這三個(gè)方法,但是還有許多其他用以操縱fragment生命周期中各個(gè)階段的回調(diào)函數(shù)。所有生命周期中的回調(diào)函數(shù)在操縱fragment生命周期一節(jié)中稍后再做討論。
除了基類fragment,這里還有幾個(gè)你可能會(huì)繼承的子類:
DialogFragment
顯示一個(gè)浮動(dòng)的對(duì)話框。使用這個(gè)類創(chuàng)建對(duì)話框是使用Activity類對(duì)話框工具方法之外的另一個(gè)不錯(cuò)的選擇,因?yàn)槟憧梢园裦ragment對(duì)話框并入到由activity管理的fragments后臺(tái)棧中,允許用戶返回到一個(gè)已經(jīng)摒棄的fragment。
ListFragment
顯示一個(gè)由適配器管理的條目列表(例如SimpleCursorAdapter),類似于ListActivity。并且提供了許多管理列表視圖的函數(shù),例如處理點(diǎn)擊事件的onListItemClick()回調(diào)函數(shù)。
PreferenceFragment
顯示一個(gè)Preference對(duì)象的體系結(jié)構(gòu)列表,類似于preferenceActivity。這在為應(yīng)用程序創(chuàng)建“設(shè)置”activity時(shí)是很實(shí)用的。
- Android App在ViewPager中使用Fragment的實(shí)例講解
- Android中ViewPager實(shí)現(xiàn)滑動(dòng)指示條及與Fragment的配合
- Android App中使用ViewPager+Fragment實(shí)現(xiàn)滑動(dòng)切換效果
- Android中使用TabHost 與 Fragment 制作頁面切換效果
- Android應(yīng)用開發(fā)中Fragment與Activity間通信示例講解
- Android應(yīng)用開發(fā)中Fragment間通信的實(shí)現(xiàn)教程
- 淺談Android app開發(fā)中Fragment的Transaction操作
- Android app開發(fā)中的Fragment入門學(xué)習(xí)教程
- Android的Fragment的生命周期各狀態(tài)和回調(diào)函數(shù)使用
- Android App中使用ListFragment的實(shí)例教程
相關(guān)文章
Flutter實(shí)現(xiàn)增強(qiáng)版的頁面懸浮按鈕的示例代碼
Flutter?自帶的?FloatingActionButton?為我們提供了一個(gè)懸浮在頂部的按鈕,這個(gè)按鈕始終在最頂層,因此可以做一些快捷的操作。本文就來和大家詳細(xì)聊聊2023-01-01Android應(yīng)用開發(fā)中CardView的初步使用指南
這篇文章主要介紹了Android應(yīng)用開發(fā)中CardView的初步使用指南,CardView主要處理一些卡片型的視圖布局,需要的朋友可以參考下2016-02-02基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問題
這篇文章主要介紹了基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android Canvas和Bitmap結(jié)合繪圖詳解流程
在 Android Canvas 上繪圖非常難,在繪圖時(shí)需要理解許多不同的類和概念。這篇文章中,將介紹 Android 框架中可用的一些類,它們可以讓畫布使用時(shí)更輕松2021-11-11Android基于RecyclerView實(shí)現(xiàn)高亮搜索列表
本文詳細(xì)介紹了Android基于RecyclerView實(shí)現(xiàn)高亮搜索列表的方法。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01android 實(shí)現(xiàn)APP中改變頭像圖片的實(shí)例代碼
這篇文章主要介紹了android 實(shí)現(xiàn)APP中改變頭像圖片的實(shí)例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07