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è),還剩3頁(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)介

1、使用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)化Ap

2、p的用戶(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,它使用特定

3、的包簽名,并且某些API名稱(chēng)和平臺(tái)包含的版本有點(diǎn)不同。在你開(kāi)始課程之前,你必須設(shè)置你的Android項(xiàng)目使用支持庫(kù)。如果你之前沒(méi)有使用支持庫(kù),按“安裝支持庫(kù)”文檔所說(shuō)的把你的項(xiàng)目設(shè)為使用v4庫(kù),你也可以使用v7 appcompat庫(kù)以便在Activity中包含操作欄,v7兼容Android2.1(API級(jí)別7)并且也包含F(xiàn)ragment API。創(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í)上,

4、這是運(yùn)行Fragment所需要的唯一回調(diào)方法。下例是一個(gè)指定自己布局的簡(jiǎn)單Fragment:import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.ViewGroup;public class ArticleFragment extends Fragment Override public View onCreateView(LayoutInflater inflater, ViewGroup container,

5、 Bundle savedInstanceState) / 填充fragment的布局 return inflater.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)

6、參考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è)備屏幕為“大”(目錄名使用了“l(fā)arge”修飾符)時(shí),向Activity添加兩個(gè)F

7、ragment的布局文件的示例:res/layout-large/news_articles.xml 提示:更多有關(guān)為不同屏幕大小創(chuàng)建布局的內(nèi)容,參看“支持不同屏幕大小”。在Activity中應(yīng)用布局:import android.os.Bundle;import android.support.v4.app.FragmentActivity;public class MainActivity extends FragmentActivity Override public void onCreate(Bundle savedInstanceState) super.onCreate(save

8、dInstanceState); setContentView(R.layout.news_articles); 如果你使用了v7 appcompat庫(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)用程

9、序時(shí),你可以基于屏幕所允許的空間,在不同的布局配置中重用Fragment以?xún)?yōu)化用戶(hù)體驗(yàn)。例如,在手機(jī)設(shè)備上為單面板用戶(hù)界面一次只顯示一個(gè)Fragment,相反,在有較寬屏幕尺寸的平板上可以并排設(shè)置Fragment來(lái)為用戶(hù)顯示更多信息。兩個(gè)Fragment,用不同配置顯示在不同屏幕尺寸上的同一個(gè)Activity中。在大屏幕上,兩個(gè)Fragment并排顯示,而在手機(jī)設(shè)備上,一次只顯示一個(gè)Fragment,必須在用戶(hù)導(dǎo)航時(shí)用一個(gè)Fragment替換另一個(gè)。FragmentManager類(lèi)提供方法允許你在運(yùn)行時(shí)為Activity添加、移除以及替換Fragment,從而創(chuàng)建動(dòng)態(tài)用戶(hù)體驗(yàn)。在運(yùn)行時(shí)向Act

10、ivity添加Fragment相比在布局文件中為Activity定義Fragment就象上節(jié)課中演示的使用元素你可以在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è)重

11、要的規(guī)則,在布局中必須有一個(gè)容器視圖供這些Fragment布局駐留。下面的布局是一個(gè)替換在上節(jié)內(nèi)容中出現(xiàn)的一次只顯示一個(gè)Fragment的布局。為了用一個(gè)Fragment替換另一個(gè),Activity包含一個(gè)FrameLayout做為Fragment的容器。注意文件名和上節(jié)內(nèi)容中的布局文件名相同,但是目錄名中沒(méi)有“l(fā)arge”修飾符,因此這個(gè)布局用于設(shè)備屏幕比“l(fā)arge”小,不能同時(shí)填充兩個(gè)Fragment的情況中。res/layout/news_articles.xml在Activity中插入代碼,調(diào)用支持庫(kù)API的getSupportFragmentManager()方法獲得Fragmen

12、tManager,然后調(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的例子:import android.os.Bundle;import android.support.v4.app.FragmentActivity;public class MainActivity extends FragmentActivity Overrid

13、e public void onCreate(Bundle savedInstanceState) 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)存在的Fragment if (savedInstan

14、ceState != null) return; / 創(chuàng)建放在Activity中的新Fragment HeadlinesFragment firstFragment = new HeadlinesFragment(); / 在這個(gè)例子中,Activity是被Intent對(duì)象的特殊指令啟動(dòng)的, / 把Intent的extras集合傳遞給Fragment做為參數(shù) firstFragment.setArguments(getIntent().getExtras(); / 把Fragment添加到容器FrameLayout中 getSupportFragmentManager().beginTrans

15、action() .add(R.id.fragment_container, firstFragment).commit(); 因?yàn)镕ragment在運(yùn)行時(shí)添加到FrameLayout容器中(替換在Activity布局文件中用元素定義的),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)航,你

16、必須在提交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ù)ArticleFragment newFragment = new ArticleFragment();Bundle args = new Bundle();args

17、.putInt(ArticleFragment.ARG_POSITION, position);newFragment.setArguments(args);FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();/ 用這個(gè)Fragment替換Fragment容器中的內(nèi)容/ 向返回棧中添加事務(wù)以便用戶(hù)可以向后導(dǎo)航transaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null)

18、;/ 提交事務(wù)mit();addToBackStack()方法有一個(gè)可選參數(shù)來(lái)為事務(wù)指定唯一名稱(chēng),不需要這個(gè)名稱(chēng),除非你打算用FragmentManager.BackStackEntry API來(lái)執(zhí)行Fragment的高級(jí)操作。和其它Fragment通信為了重用Fragment UI組件,你應(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到Fragmen

19、t的通信都是通過(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通信的例子:public class HeadlinesFragment extends ListFragment OnHeadlineSelectedListener mCallback; / 容器Activity必須實(shí)現(xiàn)

20、這個(gè)接口 public interface OnHeadlineSelectedListener public void onArticleSelected(int position); Override public void onAttach(Activity activity) super.onAttach(activity); / 確保容器Activity實(shí)現(xiàn)了回調(diào)接口, / 否則,它會(huì)拋出異常 try mCallback = (OnHeadlineSelectedListener) activity; catch (ClassCastException e) throw new Cl

21、assCastException(activity.toString() + must implement OnHeadlineSelectedListener); .現(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: Override public void onListItemClick(ListView l, View v, int position, long

22、id) / 把事件發(fā)送到父Activity mCallback.onArticleSelected(position); 實(shí)現(xiàn)接口為了從Fragment中接收事件回調(diào),父Activity必須實(shí)現(xiàn)在Fragment類(lèi)中定義的接口。下面是一個(gè)實(shí)現(xiàn)上例中接口的例子:public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener . public void onArticleSelected(int position) / 當(dāng)用戶(hù)選擇了HeadlinesF

23、ragment的標(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并顯示它。public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener . public void onArticleSelected(i

溫馨提示

  • 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)論