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

下載本文檔

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

文檔簡介

1、Android官方開發(fā)教程中文版使用Fragment創(chuàng)立動態(tài)UI使用Fragment創(chuàng)立動態(tài)UI在Android中創(chuàng)立動態(tài)、多欄的UI,你需要將UI組件和Activity行為封裝到模塊中,以便在Activity中交換。你可以使用Fragment類創(chuàng)立這些模塊,這種行為有點像一個可以自己定義布局和管理生命周期的嵌套Activity。當一個Fragment指定它自身的布局時,它能和Activity內(nèi)的其它Fragment配置成不同的組合以便為不同的屏幕大小修改你的布局結(jié)構(gòu)小屏幕一次可能只顯示一個Fragment,大屏幕那么可以顯示兩個或更多。本課程展示了如何使用Fragment創(chuàng)立動態(tài)的用戶體驗以

2、及為不同屏幕大小的設(shè)備優(yōu)化App的用戶體驗,同時繼續(xù)支持運行于低至Android1.6版本的設(shè)備。創(chuàng)立Fragment你可以認為Fragment是Activity的一個模塊化局部,它有自己的生命周期,有自己的輸入事件,并且你還可以在Activity運行時添加或移除它有點像可以在不同的Activity中重用的“子Activity。這節(jié)內(nèi)容展示了如何使用支持庫繼承Fragment,使你的App可以和運行低至Android1.6的設(shè)備保持兼容。注意:如果你決定了App要求的最小API級別為11以上,你可以使用框架內(nèi)建的Fragment類及相關(guān)的API,而不需要使用支持庫。只要知道這節(jié)課的重點在于使用

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

4、定義布局。事實上,這是運行Fragment所需要的唯一回調(diào)方法。下例是一個指定自己布局的簡單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應該實現(xiàn)其它的生命周期回調(diào)方法,這樣,當它在Activity中被添加或移除時

6、,以及Activity本身在生命周期狀態(tài)中切換時,允許你管理Fragment的狀態(tài)。例如,Activity的onPause()被調(diào)用時,Activity中的所有Fragment也會收到onPause()的調(diào)用。更多有關(guān)Fragment生命周期和回調(diào)方法的信息,請參考Fragment開發(fā)者指南。使用XML向Activity添加FragmentFragment是可重用的、模塊化的UI組件,每個Fragment類的實例都必須關(guān)聯(lián)一個父FragmentActivity。你可以在Activityr的布局XML文件中定義每一個Fragment來獲取這種關(guān)聯(lián)。注意:FragmentActivityj 是一個

7、支持庫提供的特殊的Activity,用來在低于API級別11的系統(tǒng)版本中處理Fragment。如果你支持的最低系統(tǒng)版本高于API級別11,你可以使用Activity。這里是一個當設(shè)備屏幕為“大目錄名使用了“l(fā)arge修飾符時,向Activity添加兩個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中應用布局: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庫,Activ

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

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

15、加Fragment,如果你打算在Activity生存期內(nèi)改變Fragment,你必須這樣做。要執(zhí)行添加或移除Fragment的事務(wù),你必須使用FragmentManager創(chuàng)立一個FragTransaction,它提供了添加、移除、替換及執(zhí)行其它Fragment事務(wù)的API。如果你的Activity允許移除或替換Fragment,你應該在onCreate()方法中添加初始化Fragment的代碼。在處理Fragment尤其是那些運行時添加的時有一個重要的規(guī)那么,在布局中必須有一個容器視圖供這些Fragment布局駐留。下面的布局是一個替換在上節(jié)內(nèi)容中出現(xiàn)的一次只顯示一個Fragment的布局。

16、為了用一個Fragment替換另一個,Activity包含一個FrameLayout做為Fragment的容器。注意文件名和上節(jié)內(nèi)容中的布局文件名相同,但是目錄名中沒有“l(fā)arge修飾符,因此這個布局用于設(shè)備屏幕比“l(fā)arge小,不能同時填充兩個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)用支持庫API的getSupportFragmentManager()方法獲得FragmentManager,然后調(diào)用beginTransaction()創(chuàng)立FragmentTransaction,調(diào)用add()方法添加Fragment。你可以使用同一個FragmentTransaction執(zhí)行多個Fragment事

18、務(wù),當你準備好要改變時,你必須調(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)中恢復            / 我們不需要做任何事情,直接返回            / 否那么,我們可能會覆蓋掉已經(jīng)存在的Fragment            if (savedInstanceState != null)                 return;        

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

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

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

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

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

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

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

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

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

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

31、60;         + " must implement OnHeadlineSelectedListener");                    .現(xiàn)在Fragment可以使用OnHeadlineSelectedListener接口的實例mCallback調(diào)用onArticleSelected()方法把消息發(fā)送給Activity。例如,當用戶點擊列表項時,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);    實現(xiàn)接口為了從Fragment中接收事件回調(diào),父Activity必須實現(xiàn)在Fragment類中定義的接口。下面是一個實現(xiàn)上例中接口的例子

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

34、  / 完成顯示文章的代碼    發(fā)送消息到Fragment父Activity可以把消息發(fā)給通過findFragmentById()方法捕獲的Fragment實例,然后直接調(diào)用Fragment的公開方法。例如,假設(shè)上面的Activity包含另一個Fragment,用來顯示通過上面的回調(diào)方法獲得的列表項數(shù)據(jù)。在該例中,Activity可以把在回調(diào)方法中收到的信息傳遞給另一個Fragment并顯示它。public static class MainActivity extends Activity        implemen

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

溫馨提示

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

評論

0/150

提交評論