




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Android入門之Fragment用法當(dāng)我們需要?jiǎng)討B(tài)的多界面切換的時(shí)候,就需要將UI元素和Activity融合成一個(gè)模塊。在2.3中我們一般通過各種Activity中進(jìn)行跳轉(zhuǎn)來實(shí)現(xiàn)多界面的跳轉(zhuǎn)和單個(gè)界面動(dòng)態(tài)改變。在4.0或以上系統(tǒng)中就可以使用新的特性來方便的達(dá)到這個(gè)效果-Fragment類。Fragment類似一個(gè)嵌套Activity,可以定義自己的layout和自己的生命周期。多個(gè)Fragment可以放在一個(gè)Activity中(所以上面講到類似一個(gè)嵌套Activity),而這個(gè)類可以對這些Fragment進(jìn)行配置以適應(yīng)不同的屏幕尺寸(比如平板和手機(jī))。下面將向您講述如何創(chuàng)建通過Fragme
2、nt向用戶提供一個(gè)動(dòng)態(tài)的體驗(yàn),并且還可以針對不同的屏幕尺寸做優(yōu)化,給用戶提供更好的使用體驗(yàn)。該特性可以運(yùn)行在Android1.6上面(當(dāng)然需要google庫的支持)。(allwhilecontinuingtosupportdevicesrunningversionsasoldasAndroid1.6.這個(gè)真心沒搞懂,E文好的同學(xué)指點(diǎn)下)使用Android庫Android支持庫是一個(gè)jar文件,使用這個(gè)支持庫可以讓我們在低版本上運(yùn)行高版本的特性(比如Fragment并非1.6的特性,但是通過庫的引入,我們可以將包含fragment的程序運(yùn)行在1.6上面,保證程序兼容性)。步驟:1.通過SDKMa
3、nager下載AndroidSupportPackageAfldrwJ叩工SDKPrth:cPtcktgrHShow'<Updates/New;/Insured'|ObultteSefeetNewatUcdM«Inaall1pKkA9t,.Sortby:/APHevtlRcpotilory口tai士ttAJIDdetepickiw國Dewbidingp4<Ug.2 .在項(xiàng)目代碼頂層創(chuàng)建libs文件夾,并將你需要的jar庫文件拷貝到libs里面去。3 .更新manifest文件,設(shè)置如下<uses-sdkandroid:minSdkVersion=&q
4、uot;4"android:targetSdkVersion="15"/>為了確保沒有在舊的系統(tǒng)上面使用新的api特性,卻要在使用Fragment的文件中包含如下內(nèi)容:importandroid.support.v4.app.Fragment;importandroid.support.v4.app.FragmentManager;應(yīng)該聲明FragmentActivity(而不是Activity)來包含F(xiàn)ragments。創(chuàng)建Fragment我們可以將Fragment當(dāng)成是一個(gè)獨(dú)立的Activity,它有自己獨(dú)立的生命周期、獲取單獨(dú)的觸發(fā)事件,并且在Acti
5、vity運(yùn)行的時(shí)候可以動(dòng)態(tài)的移除或者添加Fragment。更有趣的是你可以在其他地方重用這個(gè)Fragment。本節(jié)將展示通過引入支持庫,通過繼承Fragment來在低版本(最低為1.6版)上運(yùn)行包含F(xiàn)ragment的程序,保證程序的兼容性。創(chuàng)建Fragment類就像創(chuàng)建Activity類一樣,繼承Fragment,實(shí)現(xiàn)一些生命周期中的關(guān)鍵函數(shù),并且記得把你自己的功能代碼放到里面去。創(chuàng)建一個(gè)Fragment,必須使用onCreateView()定義他的layout布局文件。實(shí)際上這是讓一個(gè)Fragment能夠運(yùn)行起來的唯一一個(gè)回調(diào)函數(shù),看看下面的例子:importandroid.os.Bundl
6、e;importandroid.support.v4.app.Fragmentimportandroid.view.LayoutInflater;importandroid.view.ViewGroup;publicclassArticleFragmentextendsFragmentOverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState)/Inflatethelayoutforthisfragmentreturninflater.inflate(R.la
7、yout.article_view,containerfalse);比Activity簡單多了,不是嗎。當(dāng)然,就像Activity一樣,F(xiàn)ragment也應(yīng)該實(shí)現(xiàn)其他生命周期中的函數(shù),這樣我們才可以實(shí)現(xiàn)對他的添加刪除。舉例來說,當(dāng)activity收到onPause()方法調(diào)用的時(shí)候,它里面的Fragment同樣會(huì)被調(diào)用到onPause(),所以看好機(jī)會(huì),在Fragment里面的onPause()里面放入你寫的代碼吧。更詳細(xì)的Fragment請參考這里。使用XML將Fragment添加到一個(gè)Activity中FragmentActivity,當(dāng)重用Fragment的時(shí)候,每一個(gè)實(shí)例化的Fragm
8、ent必須依附于一個(gè)父我們可以通過在這個(gè)父活動(dòng)的布局文件xml中定義fragment。下面是一個(gè)將兩個(gè)Fragment添加到一個(gè)活動(dòng)中的例子res/layout-large/news_articles.xml:<LinearLayoutxmlns:android="http:android:orientation="horizontal"android:layout_widthandroid:layout_height="fill_parent"="fill_parent"<fragmentandroid:nam
9、e="com.example.android.fragments.HeadlinesFragment"android:id="+id/headlines_fragment"android:layout_weight="1"android:layout_width="0dp"android:layout_height="match_parent"/><fragmentandroid:name="com.example.android.fragments.ArticleFrag
10、ment"android:id="+id/article_fragment"android:layout_weightandroid:layout_widthandroid:layout_height="2"="0dp"="match_parent"/></LinearLayout>看到?jīng)]有,其實(shí)跟一般的添加edittext空間沒有任何區(qū)別,很簡單吧。Tip:想知道如何創(chuàng)建支持更多屏幕尺寸的布局,閱讀此文SupportingDifferentScreenSizes.下面就是怎么使用這個(gè)布
11、局的代碼了:importandroid.os.Bundle;importandroid.support.v4.app.FragmentActivity;publicclassMainActivityextendsFragmentActivityOverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.news_articles);Note:通過在xml中定義fragment的方式,我們不能在運(yùn)行時(shí)移除fragment。如果我們想要通
12、過切換fragments來跟用戶有更好的互動(dòng),那么就需要在activity啟動(dòng)的時(shí)候定義fragment了。創(chuàng)建更靈活的UI(進(jìn)階應(yīng)用)當(dāng)我們針對各種不同屏幕尺寸的設(shè)備設(shè)計(jì)應(yīng)用程序的時(shí)候,我們可以在不同的布局文件中重用fragments來讓客戶體驗(yàn)最優(yōu)化。比如在平板和手機(jī)上,當(dāng)使用fragment時(shí),表現(xiàn)可能就完全不一樣。平板上面我們可以將前后的兩個(gè)Fragment都顯示在屏幕上(因?yàn)槠聊豢臻g足夠顯示了,而且不至于讓屏幕空間太空),而在手機(jī)上這兩個(gè)Fragment只能進(jìn)行切換顯示了,因?yàn)槭謾C(jī)屏幕空間太小,只能夠一次顯示一屏。圖片如下:FragmeniAFragmemBFragmentAFrag
13、mentB我們可以用類FragmentManager提供一些方法,在運(yùn)行時(shí)對activity中的一些fragments進(jìn)行添加、移除、覆蓋操作,來提供給客戶一個(gè)動(dòng)態(tài)的更優(yōu)的體驗(yàn)。在運(yùn)行時(shí)添加一個(gè)Fragment到Activity上面一節(jié)的在activity的布局文件(layoutxml)中添加Fragment的方法我們已經(jīng)知道了?,F(xiàn)在我們將學(xué)習(xí)另外一種方式,這種方式允許我們在運(yùn)行時(shí)動(dòng)態(tài)的顯示和隱藏fragment。為了達(dá)到在activity中動(dòng)態(tài)管理Fragment,我們需要用到FragmentManager,并且通過它創(chuàng)建FragmentTransaction(提供針對Fragment操作的
14、些歹Uapi,add/attach/detach/hide等)。如果需要在activity中動(dòng)態(tài)的移除或者替換fragments,我們就需要在onCreate函數(shù)中將初始化的fragments加入到該activity中。在處理Fragments時(shí),特別是在運(yùn)行中動(dòng)態(tài)加入的fragments,有一個(gè)很重要的規(guī)則就是fragment必須有一個(gè)容器View,來容納fragments的layout布局。下面的layout是針對前面一節(jié)內(nèi)容的替代,每次只顯示一個(gè)fragment。為了替換當(dāng)前的fragment,這個(gè)activity的layout必須包含一個(gè)FrameLayout用來當(dāng)做fragment容
15、器。注意:該布局文件文件名是跟上節(jié)一樣,但是layout文件夾并沒有l(wèi)arge修飾,所以你懂的。(如果不懂的話也不要緊。解釋:因?yàn)闆]有l(wèi)arge修飾,所以這個(gè)layout是用在比large小的屏幕上,這樣屏幕每次只能顯示一個(gè)fragment了,不能像上圖的平板那樣顯示兩個(gè)fragment)。res/layout/news_articles.xml:<FrameLayoutxmlns:android="http:android:id="+id/fragment_container"android:layout_width="match_parent&
16、quot;android:layout_height="match_parent"/>在你的activity內(nèi),用getSupportFragmentManager()函數(shù)獲取FragmentManager。使用beginTransaction創(chuàng)建個(gè)FragmentTransaction,并且調(diào)用add()函數(shù)添力口個(gè)Fragment。我們可以用FragmentTransaction執(zhí)行多次fragment相關(guān)的操作,當(dāng)我們準(zhǔn)備切換的時(shí)候,調(diào)用函數(shù)call()就可以了。下面就是將一個(gè)fragment加入一個(gè)layout中:importandroid.os.Bundle
17、;importandroid.support.v4.app.FragmentActivity;publicclassMainActivityextendsFragmentActivityOverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.news_articles);/Checkthattheactivityisusingthelayoutversionwith/thefragment_containerFrameLayout
18、if(findViewByld(R.id.fragment_container)!=null)/However,ifwe'rebeingrestoredfromapreviousstate,/thenwedon'tneedtodoanythingandshouldreturnorelse/wecouldendupwithoverlappingfragments.if(savedInstanceState!=null)return;/CreateaninstanceofExampleFragmentHeadlinesFragmentfirstFragment=newHeadlin
19、esFragment();/IncasethisactivitywasstartedwithspecialinstructionsfromanIntent,/passtheIntent'sextrastothefragmentasargumentsfirstFragment.setArguments(getIntent().getExtras();/Addthefragmenttothe'fragment_container'FrameLayoutgetSupportFragmentManager().beginTransaction().add(R.id.fragme
20、nt_container,firstFragment).commit();因?yàn)槭窃谶\(yùn)行時(shí)加入到FrameLayout容器中,并不是寫死在xml中,所以activity能夠移除、替換該fragment。如何在兩個(gè)fragment間切換替換fragment的過程跟add差不錯(cuò),區(qū)別就是一個(gè)是replace()函數(shù),一個(gè)是add()函數(shù)。時(shí)刻要注意的是當(dāng)執(zhí)行fragment操作,比如替換或者移除一個(gè)fragment,用戶經(jīng)常的操作是回退(backward)或者還原(undo)操作。為了支持用戶的這些操作,我們要在commit()一個(gè)FragmentTransaction之前先調(diào)用函數(shù)addToBac
21、kStack()函數(shù)。注意:當(dāng)移除或者替換一個(gè)fragment,并且將這個(gè)操作放入backstack(回退堆棧?),當(dāng)fragment被移除的時(shí)候,fragment是停止的(并非銷毀)。如果用戶要回退,會(huì)從堆棧中取一個(gè)fragment并且重啟(restart)它。如果沒有加入backstack,當(dāng)移除或者替換的時(shí)候,這個(gè)fragment就直接被銷毀了。切換fragment如下:/CreatefragmentandgiveitanargumentspecifyingthearticleitshouldshowArticleFragmentnewFragment=newArticleFragmen
22、t();Bundleargs=newBundle();args.putInt(ArticleFragment.ARG_POSITION,position);newFragment.setArguments(args);FragmentTransactiontransaction=getSupportFragmentManager().beginTransaction();/Replacewhateverisinthefragment_containerviewwiththisfragment,/andaddthetransactiontothebackstacksotheusercannavi
23、gatebacktransaction.replace(R.id.fragment_container,newFragment);transaction.addToBackStack(null);/Committhetransactionmit();addToBackStack()里面的有一個(gè)可選的String參數(shù),該參數(shù)在需要使用FragmentManager.BackStackEntry類的APIs的時(shí)候需要用到。Fragment間通信為了重用FragmentUI,我們就需要將該Fragment建立成一個(gè)可以自包含(自閉)的系統(tǒng),擁有自己的layout和行為。一旦定義了這些可重用的frag
24、ments,就可以將他們綁定到一個(gè)activity上,實(shí)現(xiàn)全部的活動(dòng)UI。很多時(shí)候我們想要在兩個(gè)fragments間進(jìn)行通信(例如根據(jù)用戶輸入改變內(nèi)容),所有的Fragment間通信都是通過他們所依附的Activity,他們之間永遠(yuǎn)不能夠直接通信。定義一個(gè)接口為了允許一個(gè)Fragment跟包含他的Activity通信,我們可以在Fragment類中定義一個(gè)接口,并且在Activity內(nèi)實(shí)現(xiàn)。Fragment在onAttach()函數(shù)里面捕獲接口實(shí)現(xiàn),并且調(diào)用接口方法和Activity通信。(上面都說了Fragment間只能通過Activity進(jìn)行通信了。)看看下面的Fragment和Activ
25、ity通信的例子:publicclassHeadlinesFragmentextendsListFragmentOnHeadlineSelectedListenermCallback;/ContainerActivitymustimplementthisinterfacepublicinterfaceOnHeadlineSelectedListenerpublicvoidonArticleSelected(intposition);)OverridepublicvoidonAttach(Activityactivity)super.onAttach(activity);/Thismakessu
26、rethatthecontaineractivityhasimplemented/thecallbackinterface.Ifnot,itthrowsanexceptiontrymCallback=(OnHeadlineSelectedListener)activity;catch(ClassCastExceptione)thrownewClassCastException(activity.toString()+"mustimplementOnHeadlineSelectedListener");.現(xiàn)在Fragment可以通過onArticleSelected()函數(shù),
27、將消息傳遞到到Activity中。通過使用OnHeadlineSelectedListener的實(shí)例達(dá)到傳遞的目的。例如:下面的例子中,當(dāng)點(diǎn)擊一個(gè)列表的元素的時(shí)候,fragment中的一個(gè)方法被調(diào)用。Fragment使用mcallback這個(gè)實(shí)例化的東東,將該事件傳遞給它所依附的父ActivityoOverridepublicvoidonListItemClick(ListViewl,Viewv,intposition,longid)/SendtheeventtothehostactivitymCallback.onArticleSelected(position);實(shí)現(xiàn)接口為了從Fragme
28、nt中接受事件消息,父activity必須實(shí)現(xiàn)fragment類中定義的幾個(gè)接口。示例如下:publicstaticclassMainActivityextendsActivityimplementsHeadlinesFragment.OnHeadlineSelectedListener.publicvoidonArticleSelected(intposition)/TheuserselectedtheheadlineofanarticlefromtheHeadlinesFragment/Dosomethingheretodisplaythatarticle傳遞消息到Fragment中宿主Activity可以可以通過findFragmentById()函數(shù)獲取Fragment實(shí)例,然后通過訪問fragments的共有函數(shù)來將消息傳遞給Fragments。在下面的實(shí)例中,宿主類將在回調(diào)函數(shù)中獲取的信息傳遞到另外一個(gè)顯示這些數(shù)據(jù)的Fragment中:publicstaticclassMainActivityextendsActivity.OnHeadlineSelectedListener(intposition)implementsHeadlinesFragmentpublicvoidonArticl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公路護(hù)欄修建合同范本
- 個(gè)人用電協(xié)議合同范例
- 公司運(yùn)輸購銷合同范本
- 刻字木材出售合同范本
- 個(gè)人旅游陪玩合同范本
- 個(gè)人住家保姆合同范本
- 勞務(wù)代理加盟合同范例
- fidic銀皮書合同范例
- 出售電廠燒火料合同范本
- fpc代加工合同范本
- 2008 年全國高校俄語專業(yè)四級水平測試試卷
- 需求供給與均衡價(jià)格PPT課件
- 金融工程鄭振龍課后習(xí)題答案
- 最常用2000個(gè)英語單詞_(全部標(biāo)有注釋)字母排序
- 人造革的幾種生產(chǎn)制造方法
- 在銀行大零售業(yè)務(wù)工作會(huì)議上的講話講解學(xué)習(xí)
- 發(fā)電廠動(dòng)力部分復(fù)習(xí)資料
- 古代傳說中的藝術(shù)形象-
- 水電站大壩土建安裝工程懸臂模板施工手冊
- 三體系內(nèi)審檢查表(共58頁).doc
- 家樂福 全套管控文件
評論
0/150
提交評論