Android使用Fragment創(chuàng)建動(dòng)態(tài)UI_第1頁(yè)
Android使用Fragment創(chuàng)建動(dòng)態(tài)UI_第2頁(yè)
Android使用Fragment創(chuàng)建動(dòng)態(tài)UI_第3頁(yè)
Android使用Fragment創(chuàng)建動(dòng)態(tài)UI_第4頁(yè)
Android使用Fragment創(chuàng)建動(dòng)態(tài)UI_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Android使用Fragment創(chuàng)建動(dòng)態(tài)UI使用Fragment創(chuàng)建動(dòng)態(tài)UI使用Fragment創(chuàng)建動(dòng)態(tài)UI在Android中創(chuàng)建動(dòng)態(tài)、多欄的UI,你需要將UI組件和Activity行為封裝到模塊中,以便在Activity中交換。你可以使用Fragment類(lèi)創(chuàng)建這些模塊,這種行為有點(diǎn)像一個(gè)可以自己定義布局和管理生命周期的嵌套Activity。當(dāng)一個(gè)Fragment指定它自身的布局時(shí),它能和Activity內(nèi)的其它Fragment配置成不同的組合以便為不同的屏幕大小修改你的布局結(jié)構(gòu)(小屏幕一次可能只顯示一個(gè)Fragment,大屏幕則可以顯示兩個(gè)或更多)。本課程展示了如何使用Fragment創(chuàng)建動(dòng)態(tài)的用戶(hù)體驗(yàn)以及為不同屏幕大小的設(shè)備優(yōu)化App的用戶(hù)體驗(yàn),同時(shí)繼續(xù)支持運(yùn)行于低至Android1.6版本的設(shè)備。創(chuàng)建Fragment你可以認(rèn)為Fragment是Activity的一個(gè)模塊化部分,它有自己的生命周期,有自己的輸入事件,并且你還可以在Activity運(yùn)行時(shí)添加或移除它(有點(diǎn)像可以在不同的Activity中重用的"子Activity")。這節(jié)內(nèi)容展示了如何使用支持庫(kù)繼承Fragment,使你的App可以和運(yùn)行低至Android1.6的設(shè)備保持兼容。注意:如果你決定了App要求的最小API級(jí)別為11以上,你可以使用框架內(nèi)建的Fragment類(lèi)及相關(guān)的API,而不需要使用支持庫(kù)。只要知道這節(jié)課的重點(diǎn)在于使用支持庫(kù)API,它使用特定的包簽名,并且某些API名稱(chēng)和平臺(tái)包含的版本有點(diǎn)不同。在你開(kāi)始課程之前,你必須設(shè)置你的Android項(xiàng)目使用支持庫(kù)。如果你之前沒(méi)有使用支持庫(kù),按"安裝支持庫(kù)"文檔所說(shuō)的把你的項(xiàng)目設(shè)為使用v4庫(kù),你也可以使用v7appcompat庫(kù)以便在Activity中包含操作欄,v7兼容Android2.1(API級(jí)別7)并且也包含F(xiàn)ragmentAPI。創(chuàng)建Fragment類(lèi)要?jiǎng)?chuàng)建Fragment,從Fragment類(lèi)繼承,重寫(xiě)關(guān)鍵的生命周期方法以插入App的應(yīng)用邏輯,就像你在Activity類(lèi)做的一樣。不同的是,創(chuàng)建Fragment時(shí),你必須在onCreateView()回調(diào)方法中定義布局。事實(shí)上,這是運(yùn)行Fragment所需要的唯一回調(diào)方法。下例是一個(gè)指定自己布局的簡(jiǎn)單Fragment:importandroid.os.Bundle;importandroid.support.v4.app.Fragment;importandroid.view.LayoutInflater;importandroid.view.ViewGroup;publicclassArticleFragmentextendsFragment{@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){//填充fragment的布局returninflater.inflate(R.layout.article_view,container,false);}}就像Activity一樣,F(xiàn)ragment應(yīng)該實(shí)現(xiàn)其它的生命周期回調(diào)方法,這樣,當(dāng)它在Activity中被添加或移除時(shí),以及Activity本身在生命周期狀態(tài)中切換時(shí),允許你管理Fragment的狀態(tài)。例如,Activity的onPause()被調(diào)用時(shí),Activity中的所有Fragment也會(huì)收到onPause()的調(diào)用。更多有關(guān)Fragment生命周期和回調(diào)方法的信息,請(qǐng)參考Fragment開(kāi)發(fā)者指南。使用XML向Activity添加FragmentFragment是可重用的、模塊化的UI組件,每個(gè)Fragment類(lèi)的實(shí)例都必須關(guān)聯(lián)一個(gè)父FragmentActivity。你可以在Activityr的布局XML文件中定義每一個(gè)Fragment來(lái)獲取這種關(guān)聯(lián)。注意:FragmentActivityj是一個(gè)支持庫(kù)提供的特殊的Activity,用來(lái)在低于API級(jí)別11的系統(tǒng)版本中處理Fragment。如果你支持的最低系統(tǒng)版本高于API級(jí)別11,你可以使用Activity。這里是一個(gè)當(dāng)設(shè)備屏幕為"大"(目錄名使用了"large"修飾符)時(shí),向Activity添加兩個(gè)Fragment的布局文件的示例:res/layout-large/news_articles.xml<LinearLayoutxmlns:android="/apk/res/android"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="fill_parent"><fragmentandroid:name="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.ArticleFragment"android:id="@+id/article_fragment"android:layout_weight="2"android:layout_width="0dp"android:layout_height="match_parent"/></LinearLayout>提示:更多有關(guān)為不同屏幕大小創(chuàng)建布局的內(nèi)容,參看"支持不同屏幕大小"。在Activity中應(yīng)用布局:importandroid.os.Bundle;importandroid.support.v4.app.FragmentActivity;publicclassMainActivityextendsFragmentActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.news_articles);}}如果你使用了v7appcompat庫(kù),Activity應(yīng)該繼承ActionBarActivity,這是FragmentActivity的一個(gè)子類(lèi)(更多信息請(qǐng)參見(jiàn)"添加操作欄")。注意:當(dāng)你通過(guò)在布局XML文件中的聲明Fragment的方式向Activity布局添加Fragment時(shí),你不能在運(yùn)行時(shí)移除Fragment。如果你打算在用戶(hù)交互時(shí)交換Fragment,你必須在Activity首次啟動(dòng)時(shí)添加Fragment,這將在下一節(jié)演示。構(gòu)建靈活的UI當(dāng)為較大范圍的屏幕尺寸設(shè)計(jì)應(yīng)用程序時(shí),你可以基于屏幕所允許的空間,在不同的布局配置中重用Fragment以?xún)?yōu)化用戶(hù)體驗(yàn)。例如,在手機(jī)設(shè)備上為單面板用戶(hù)界面一次只顯示一個(gè)Fragment,相反,在有較寬屏幕尺寸的平板上可以并排設(shè)置Fragment來(lái)為用戶(hù)顯示更多信息。FragmentManager類(lèi)提供方法允許你在運(yùn)行時(shí)為Activity添加、移除以及替換Fragment,從而創(chuàng)建動(dòng)態(tài)用戶(hù)體驗(yàn)。在運(yùn)行時(shí)向Activity添加Fragment相比在布局文件中為Activity定義Fragment--就象上節(jié)課中演示的使用<fragment>元素--你可以在Activity運(yùn)行時(shí)添加Fragment,如果你打算在Activity生存期內(nèi)改變Fragment,你必須這樣做。要執(zhí)行添加或移除Fragment的事務(wù),你必須使用FragmentManager創(chuàng)建一個(gè)FragTransaction,它提供了添加、移除、替換及執(zhí)行其它Fragment事務(wù)的API。如果你的Activity允許移除或替換Fragment,你應(yīng)該在onCreate()方法中添加初始化Fragment的代碼。在處理Fragment(尤其是那些運(yùn)行時(shí)添加的)時(shí)有一個(gè)重要的規(guī)則,在布局中必須有一個(gè)容器視圖供這些Fragment布局駐留。下面的布局是一個(gè)替換在上節(jié)內(nèi)容中出現(xiàn)的一次只顯示一個(gè)Fragment的布局。為了用一個(gè)Fragment替換另一個(gè),Activity包含一個(gè)FrameLayout做為Fragment的容器。注意文件名和上節(jié)內(nèi)容中的布局文件名相同,但是目錄名中沒(méi)有"large"修飾符,因此這個(gè)布局用于設(shè)備屏幕比"large"小,不能同時(shí)填充兩個(gè)Fragment的情況中。res/layout/news_articles.xml<FrameLayoutxmlns:android="/apk/res/android"android:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="match_parent"/>在Activity中插入代碼,調(diào)用支持庫(kù)API的getSupportFragmentManager()方法獲得FragmentManager,然后調(diào)用beginTransaction()創(chuàng)建FragmentTransaction,調(diào)用add()方法添加Fragment。你可以使用同一個(gè)FragmentTransaction執(zhí)行多個(gè)Fragment事務(wù),當(dāng)你準(zhǔn)備好要改變時(shí),你必須調(diào)用commit()方法。下面是如何向Activity中添加Fragment的例子:importandroid.os.Bundle;importandroid.support.v4.app.FragmentActivity;publicclassMainActivityextendsFragmentActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.news_articles);//檢查Activity正在使用的包含F(xiàn)ragment容器FrameLayout的布局版本if(findViewById(R.id.fragment_container)!=null){//如果我們是從較早的狀態(tài)中恢復(fù)//我們不需要做任何事情,直接返回//否則,我們可能會(huì)覆蓋掉已經(jīng)存在的Fragmentif(savedInstanceState!=null){return;}//創(chuàng)建放在Activity中的新FragmentHeadlinesFragmentfirstFragment=newHeadlinesFragment();//在這個(gè)例子中,Activity是被Intent對(duì)象的特殊指令啟動(dòng)的,//把Intent的extras集合傳遞給Fragment做為參數(shù)firstFragment.setArguments(getIntent().getExtras());//把Fragment添加到容器FrameLayout中g(shù)etSupportFragmentManager().beginTransaction().add(R.id.fragment_container,firstFragment).commit();}}}因?yàn)镕ragment在運(yùn)行時(shí)添加到FrameLayout容器中(替換在Activity布局文件中用<fragment>元素定義的),Activity可以移除它,并用另一個(gè)Fragment替換它。用一個(gè)Fragment替換另一個(gè)替換Fragment的過(guò)程就是簡(jiǎn)單的添加一個(gè)Fragment,只不過(guò)是用replace()方法代替add()方法。請(qǐng)記住,當(dāng)執(zhí)行Fragment事務(wù),如替換或刪除Fragment時(shí),它通常允許用戶(hù)向后導(dǎo)航并"撤銷(xiāo)"改變。要允許用戶(hù)通過(guò)Fragment事務(wù)向后導(dǎo)航,你必須在提交FragmentTransaction之前調(diào)用addToBackStack()方法。注意:當(dāng)你移除或替換一個(gè)Fragment并把事務(wù)添加到返回棧時(shí),被移除的Fragment處于停止?fàn)顟B(tài)(不是被銷(xiāo)毀)。如果用戶(hù)向后導(dǎo)航以恢復(fù)Fragment,它會(huì)重新啟動(dòng)。如果你沒(méi)有向返回棧中添加事務(wù),那么移除或替換Fragment時(shí),它被銷(xiāo)毀。下面是替換Fragment的例子://創(chuàng)建一個(gè)Fragment并給它指定一個(gè)要顯示的文章做為參數(shù)ArticleFragmentnewFragment=newArticleFragment();Bundleargs=newBundle();args.putInt(ArticleFragment.ARG_POSITION,position);newFragment.setArguments(args);FragmentTransactiontransaction=getSupportFragmentManager().beginTransaction();//用這個(gè)Fragment替換Fragment容器中的內(nèi)容//向返回棧中添加事務(wù)以便用戶(hù)可以向后導(dǎo)航transaction.replace(R.id.fragment_container,newFragment);transaction.addToBackStack(null);//提交事務(wù)mit();addToBackStack()方法有一個(gè)可選參數(shù)來(lái)為事務(wù)指定唯一名稱(chēng),不需要這個(gè)名稱(chēng),除非你打算用FragmentManager.BackStackEntryAPI來(lái)執(zhí)行Fragment的高級(jí)操作。和其它Fragment通信為了重用FragmentUI組件,你應(yīng)該定義一個(gè)完全獨(dú)立的、模塊化的組件,它定義了自己的布局和行為。一旦你定義了這些可重用的Fragment,你可以把它們和Activity結(jié)合起來(lái),并關(guān)連應(yīng)用程序邏輯以實(shí)現(xiàn)整體組合UI。通常你會(huì)希望一個(gè)Fragment能和其它Fragment通信,比如基于用戶(hù)事件改變內(nèi)容。所有Fragment到Fragment的通信都是通過(guò)相關(guān)的Activity,兩個(gè)Fragment之間應(yīng)該永遠(yuǎn)不要直接通信。定義接口要允許一個(gè)Fragment和它所在的Activity通信,你可以在Fragment類(lèi)中定義一個(gè)接口,在Activity中實(shí)現(xiàn)它。Fragment會(huì)在onAttach()生命周期回調(diào)方法中捕獲接口的實(shí)現(xiàn),并能調(diào)用接口方法和Activity通信。下面是Fragment和Activity通信的例子:publicclassHeadlinesFragmentextendsListFragment{OnHeadlineSelectedListenermCallback;//容器Activity必須實(shí)現(xiàn)這個(gè)接口publicinterfaceOnHeadlineSelectedListener{publicvoidonArticleSelected(intposition);}@OverridepublicvoidonAttach(Activityactivity){super.onAttach(activity);//確保容器Activity實(shí)現(xiàn)了回調(diào)接口,//否則,它會(huì)拋出異常try{mCallback=(OnHeadlineSelectedListener)activity;}catch(ClassCastExceptione){thrownewClassCastException(activity.toString()+"mustimplementOnHeadlineSelectedListener");}}...}現(xiàn)在Fragment可以使用OnHeadlineSelectedListener接口的實(shí)例mCallback調(diào)用onArticleSelected()方法把消息發(fā)送給Activity。例如,當(dāng)用戶(hù)點(diǎn)擊列表項(xiàng)時(shí),F(xiàn)ragment中的方法使用回調(diào)接品把事件發(fā)送到父Activity:@OverridepublicvoidonListItemClick(ListViewl,Viewv,intposition,longid){//把事件發(fā)送到父ActivitymCallback.onArticleSelected(position);}實(shí)現(xiàn)接口為了從Fragment中接收事件回調(diào),父Activity必須實(shí)現(xiàn)在Fragment類(lèi)中定義的接口。下面是一個(gè)實(shí)現(xiàn)上例中接口的例子:publicstaticclassMainActivityextendsActivityimplementsHeadlinesFragment.OnHeadlineSelectedListener{...publicvoidonArticleSelected(intposition){//當(dāng)用戶(hù)選擇了HeadlinesFragment的標(biāo)題時(shí),//完成顯示文章的代碼}}發(fā)送消息到Fragment父Activity可以把消息發(fā)給通過(guò)findFragmentById()方法捕獲的Fragment實(shí)例,然后直接調(diào)用Fragment的公開(kāi)方法。例如,假設(shè)上面的Activity包含另一個(gè)Fragment,用來(lái)顯示通過(guò)上面的回調(diào)方法獲得的列表項(xiàng)數(shù)據(jù)。在該例中,Activity可以把在回調(diào)方法中收到的信息傳遞給另一個(gè)Fragment并顯示它。publicstaticclassMainActivityextendsActivityimplementsHeadlinesFragment.OnHeadlineSelectedListener{...publicvoidonArticleSelected(intposition){//當(dāng)用戶(hù)選擇了HeadlinesFragment的標(biāo)題時(shí),//完成顯示文章的代碼ArticleFragme

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論