Android官方開(kāi)發(fā)教程中文版(五)_第1頁(yè)
Android官方開(kāi)發(fā)教程中文版(五)_第2頁(yè)
Android官方開(kāi)發(fā)教程中文版(五)_第3頁(yè)
Android官方開(kāi)發(fā)教程中文版(五)_第4頁(yè)
Android官方開(kāi)發(fā)教程中文版(五)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Android官方開(kāi)發(fā)教程中文版使用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類創(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)的用戶體驗(yàn)以

2、及為不同屏幕大小的設(shè)備優(yōu)化App的用戶體驗(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類及相關(guān)的API,而不需要使用支持庫(kù)。只要知道這節(jié)課的重點(diǎn)在于使用

3、支持庫(kù)API,它使用特定的包簽名,并且某些API名稱和平臺(tái)包含的版本有點(diǎn)不同。在你開(kāi)始課程之前,你必須設(shè)置你的Android工程使用支持庫(kù)。如果你之前沒(méi)有使用支持庫(kù),按“安裝支持庫(kù)文檔所說(shuō)的把你的工程設(shè)為使用v4庫(kù),你也可以使用v7 appcompat庫(kù)以便在Activity中包含操作欄,v7兼容Android2.1API級(jí)別7并且也包含F(xiàn)ragment API。創(chuàng)立Fragment類要?jiǎng)?chuàng)立Fragment,從Fragment類繼承,重寫(xiě)關(guān)鍵的生命周期方法以插入App的應(yīng)用邏輯,就像你在Activity類做的一樣。不同的是,創(chuàng)立Fragment時(shí),你必須在onCreateView()回調(diào)方法中

4、定義布局。事實(shí)上,這是運(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(LayoutInf

5、later inflater, ViewGroup container,        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í)

6、,以及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類的實(shí)例都必須關(guān)聯(lián)一個(gè)父FragmentActivity。你可以在Activityr的布局XML文件中定義每一個(gè)Fragment來(lái)獲取這種關(guān)聯(lián)。注意:FragmentActivityj 是一個(gè)

7、支持庫(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è)Fragment的布局文件的例如:res/layout-large/news_articles.xml<LinearLayout xmlns:android=" :/schemas.android /apk/res/android"    android:orientation="horiz

8、ontal"    android:layout_width="fill_parent"    android:layout_height="fill_parent">    <fragment android:name="com.example.android.fragments.HeadlinesFragment"              android:id="+id

9、/headlines_fragment"              android:layout_weight="1"              android:layout_width="0dp"              android:layout_height="match_parent" /> 

10、;   <fragment android:name="com.example.android.fragments.ArticleFragment"              android:id="+id/article_fragment"              android:layout_weight="2"        

11、0;     android:layout_width="0dp"              android:layout_height="match_parent" /></LinearLayout>提示:更多有關(guān)為不同屏幕大小創(chuàng)立布局的內(nèi)容,參看“支持不同屏幕大小。在Activity中應(yīng)用布局:import android.os.Bundle;import android.support.v4.app.FragmentActivity;publ

12、ic class MainActivity extends FragmentActivity     Override    public void onCreate(Bundle savedInstanceState)         super.onCreate(savedInstanceState);        setContentView(R.layout.news_articles);    如果你使用了v7 appcompat庫(kù),Activ

13、ity應(yīng)該繼承ActionBarActivity,這是FragmentActivity的一個(gè)子類更多信息請(qǐng)參見(jiàn)“添加操作欄。注意:當(dāng)你通過(guò)在布局XML文件中的聲明Fragment的方式向Activity布局添加Fragment時(shí),你不能在運(yùn)行時(shí)移除Fragment。如果你打算在用戶交互時(shí)交換Fragment,你必須在Activity首次啟動(dòng)時(shí)添加Fragment,這將在下一節(jié)演示。構(gòu)建靈活的UI當(dāng)為較大范圍的屏幕尺寸設(shè)計(jì)應(yīng)用程序時(shí),你可以基于屏幕所允許的空間,在不同的布局配置中重用Fragment以優(yōu)化用戶體驗(yàn)。例如,在 設(shè)備上為單面板用戶界面一次只顯示一個(gè)Fragment,相反,在有較寬屏幕

14、尺寸的平板上可以并排設(shè)置Fragment來(lái)為用戶顯示更多信息。兩個(gè)Fragment,用不同配置顯示在不同屏幕尺寸上的同一個(gè)Activity中。在大屏幕上,兩個(gè)Fragment并排顯示,而在 設(shè)備上,一次只顯示一個(gè)Fragment,必須在用戶導(dǎo)航時(shí)用一個(gè)Fragment替換另一個(gè)。FragmentManager類提供方法允許你在運(yùn)行時(shí)為Activity添加、移除以及替換Fragment,從而創(chuàng)立動(dòng)態(tài)用戶體驗(yàn)。在運(yùn)行時(shí)向Activity添加Fragment相比在布局文件中為Activity定義Fragment就象上節(jié)課中演示的使用<fragment>元素你可以在Activity運(yùn)行時(shí)添

15、加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的布局。

16、為了用一個(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<FrameLayout xmlns:android=" :/schemas.android /apk/res/android"    android:id="+id/fragment_container"

17、    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事

18、務(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     Override    public void onCreate(Bundle savedInstanceState)         super.on

19、Create(savedInstanceState);        setContentView(R.layout.news_articles);        / 檢查Activity正在使用的包含F(xiàn)ragment容器FrameLayout的布局版本        if (findViewById(R.id.fragment_container) != null)             / 如果我們是從較早的狀

20、態(tài)中恢復(fù)            / 我們不需要做任何事情,直接返回            / 否那么,我們可能會(huì)覆蓋掉已經(jīng)存在的Fragment            if (savedInstanceState != null)                 return;        

21、60;               / 創(chuàng)立放在Activity中的新Fragment             HeadlinesFragment firstFragment = new HeadlinesFragment();                        / 在這個(gè)例子中,Activity是被Intent對(duì)象的特殊指令啟動(dòng)的,&

22、#160;     / 把Intent的extras集合傳遞給Fragment做為參數(shù)            firstFragment.setArguments(getIntent().getExtras();                        / 把Fragment添加到容器FrameLayout中           

23、getSupportFragmentManager().beginTransaction()                    .add(R.id.fragment_container, firstFragment) mit();            因?yàn)镕ragment在運(yùn)行時(shí)添加到FrameLayout容器中替換在Activity布局文件中用<fragment>元素定義的,Activity可以移除它,并用另一個(gè)Fr

24、agment替換它。用一個(gè)Fragment替換另一個(gè)替換Fragment的過(guò)程就是簡(jiǎn)單的添加一個(gè)Fragment,只不過(guò)是用replace()方法代替add()方法。請(qǐng)記住,當(dāng)執(zhí)行Fragment事務(wù),如替換或刪除Fragment時(shí),它通常允許用戶向后導(dǎo)航并“撤銷改變。要允許用戶通過(guò)Fragment事務(wù)向后導(dǎo)航,你必須在提交FragmentTransaction之前調(diào)用addToBackStack()方法。注意:當(dāng)你移除或替換一個(gè)Fragment并把事務(wù)添加到返回棧時(shí),被移除的Fragment處于停止?fàn)顟B(tài)不是被銷毀。如果用戶向后導(dǎo)航以恢復(fù)Fragment,它會(huì)重新啟動(dòng)。如果你沒(méi)有向返回棧中添加

25、事務(wù),那么移除或替換Fragment時(shí),它被銷毀。下面是替換Fragment的例子:/ 創(chuàng)立一個(gè)Fragment并給它指定一個(gè)要顯示的文章做為參數(shù)ArticleFragment newFragment = new ArticleFragment();Bundle args = new Bundle();args.putInt(ArticleFragment.ARG_POSITION, position);newFragment.setArguments(args);FragmentTransaction transaction = getSupportFragmentManager().beg

26、inTransaction();/ 用這個(gè)Fragment替換Fragment容器中的內(nèi)容/ 向返回棧中添加事務(wù)以便用戶可以向后導(dǎo)航transaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null);/ 提交事務(wù)transaction mit();addToBackStack()方法有一個(gè)可選參數(shù)來(lái)為事務(wù)指定唯一名稱,不需要這個(gè)名稱,除非你打算用FragmentManager.BackStackEntry API來(lái)執(zhí)行Fragment的高級(jí)操作。和其它Fragment通信為了重用F

27、ragment UI組件,你應(yīng)該定義一個(gè)完全獨(dú)立的、模塊化的組件,它定義了自己的布局和行為。一旦你定義了這些可重用的Fragment,你可以把它們和Activity結(jié)合起來(lái),并關(guān)連應(yīng)用程序邏輯以實(shí)現(xiàn)整體組合UI。通常你會(huì)希望一個(gè)Fragment能和其它Fragment通信,比方基于用戶事件改變內(nèi)容。所有Fragment到Fragment的通信都是通過(guò)相關(guān)的Activity,兩個(gè)Fragment之間應(yīng)該永遠(yuǎn)不要直接通信。定義接口要允許一個(gè)Fragment和它所在的Activity通信,你可以在Fragment類中定義一個(gè)接口,在Activity中實(shí)現(xiàn)它。Fragment會(huì)在onAttach()生

28、命周期回調(diào)方法中捕獲接口的實(shí)現(xiàn),并能調(diào)用接口方法和Activity通信。下面是Fragment和Activity通信的例子:public class HeadlinesFragment extends ListFragment     OnHeadlineSelectedListener mCallback;    / 容器Activity必須實(shí)現(xiàn)這個(gè)接口    public interface OnHeadlineSelectedListener         public void onA

29、rticleSelected(int position);        Override    public void onAttach(Activity activity)         super.onAttach(activity);                / 確保容器Activity實(shí)現(xiàn)了回調(diào)接口,         / 否那么,它會(huì)拋出異常  &#

30、160;     try             mCallback = (OnHeadlineSelectedListener) activity;        catch (ClassCastException e)             throw new ClassCastException(activity.toString()          

31、60;         + " must implement OnHeadlineSelectedListener");                    .現(xiàn)在Fragment可以使用OnHeadlineSelectedListener接口的實(shí)例mCallback調(diào)用onArticleSelected()方法把消息發(fā)送給Activity。例如,當(dāng)用戶點(diǎn)擊列表項(xiàng)時(shí),F(xiàn)ragment中的方法使用回調(diào)接品把事件發(fā)送到父Activity:

32、    Override    public void onListItemClick(ListView l, View v, int position, long id)         / 把事件發(fā)送到父Activity        mCallback.onArticleSelected(position);    實(shí)現(xiàn)接口為了從Fragment中接收事件回調(diào),父Activity必須實(shí)現(xiàn)在Fragment類中定義的接口。下面是一個(gè)實(shí)現(xiàn)上例中接口的例子

33、:public static class MainActivity extends Activity        implements HeadlinesFragment.OnHeadlineSelectedListener    .        public void onArticleSelected(int position)         / 當(dāng)用戶選擇了HeadlinesFragment的標(biāo)題時(shí),      

34、  / 完成顯示文章的代碼    發(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        implemen

35、ts HeadlinesFragment.OnHeadlineSelectedListener    .    public void onArticleSelected(int position)         / 當(dāng)用戶選擇了HeadlinesFragment的標(biāo)題時(shí),         / 完成顯示文章的代碼        ArticleFragment articleFrag = (ArticleFragment)                getSupportFragmentManager().findFragmentById(R.id.article_fragment);        if (articleFrag != null)             / 如果顯示文章的Fragment可用,我們處于雙欄布局中.            / 調(diào)用ArticleFrag

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論