an應(yīng)用開發(fā)技術(shù)2018秋課件04深入理解act與fragment_第1頁
an應(yīng)用開發(fā)技術(shù)2018秋課件04深入理解act與fragment_第2頁
an應(yīng)用開發(fā)技術(shù)2018秋課件04深入理解act與fragment_第3頁
an應(yīng)用開發(fā)技術(shù)2018秋課件04深入理解act與fragment_第4頁
an應(yīng)用開發(fā)技術(shù)2018秋課件04深入理解act與fragment_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、深入理解Activity與Fragment浙大軟件學(xué)院梁秀波綱要 建立、配置和使用Activity Activity的回調(diào)機(jī)制 Activity的生命周期 Activity的加載模式 什么是Fragment 如何使用Fragment 小結(jié)1、建立、配置和使用Activity Activity是Android應(yīng)用中最重要、最常見的應(yīng)用組件。實際應(yīng)用中,包含多個Activity,實現(xiàn)不同的Activity向用戶呈現(xiàn)不同的操作界面。Android應(yīng)用的多個Activity組成Activity棧,當(dāng)前活動的Activity位于棧頂。 Activity的作用 用戶與應(yīng)用程序交互的接口; 作為放置控件的容

2、器。 在Activity中添加的控件,程序中通過findViewById(int id)方法,來獲取所添加的控件,這些組件都要有一個ID。 接下來詳細(xì)介紹Activity開發(fā)、配置和使用。1、建立、配置和使用Activity 1.1 建立Activity 建立一個Activity的步驟如下: 建立Activity需要繼承Activity基類,根據(jù)不同的需要,有時也需要繼承Activity的子類。 需要復(fù)寫onCreate()方法(由應(yīng)用程序的框架調(diào)用)。 每一個Activity必須在AndroidManifest.XML文件中進(jìn)行配置 為Activity添加必要的控件。 實例 LaucherA

3、ctivity的使用(codes044.1OtherActivity)類名類名默認(rèn)啟動默認(rèn)啟動1、建立、配置和使用Activity標(biāo)簽標(biāo)簽1、建立、配置和使用Activity1、建立、配置和使用Activity 上面的程序中用到了兩個Activity。 ExpandableListActivityTest:它是ExpandableListActivity的子類,用于顯示一個可展開的列表窗口。 PreferenceActivityTest:它是PreferenceActivity的子類,用于顯示一個顯示設(shè)置選項參數(shù)并進(jìn)行保存的窗口。 先看ExpandableListActivityTest,它繼

4、承了ExpandableListActivity基類,其使用主要是為該Activity傳入一個ExpandableListAdapter對象,ExpandableListActivity將會生成一個顯示可展開的列表的窗口。 接下來看一下ExpandableListActivityTest的代碼1、建立、配置和使用Activity1、建立、配置和使用Activity 如果我們要建立一個Activity專門用于設(shè)置選項參數(shù),那么這個類可繼承PreferenceActivity。一旦一個Activity繼承了PreferenceActivity,那么該類完全不需要再控制Preferences的讀寫,

5、 PreferenceActivity為做好這一切。 使用PreferenceActivity與眾不同的一點是,它的界面布局不再使用普通的XxxLayout作為根元素,而是使用PreferenceScreen作為根元素,它表明定義一個參數(shù)設(shè)置的界面布局。1、建立、配置和使用ActivityAndroid Studio為PreferencesActivity創(chuàng)建對應(yīng)的界面布局文件,New-Android resources file,如下所示填寫:1、建立、配置和使用Activity1、建立、配置和使用Activity 在定義了參數(shù)設(shè)置界面布局文件之后,接下來在Activity程序中使用該界面布

6、局文件進(jìn)行參數(shù)設(shè)置、保存,步驟如下: 讓Activity繼承PreferenceActivity。 在onCreate(Bundle savedInstanceState)方法中調(diào)用addPreferencesFromResource()方法加載指定的界面布局文件。1、建立、配置和使用Activity1、建立、配置和使用Activity1.2 配置ActivityAndroid應(yīng)用要求所有應(yīng)用程序組件都必須顯示進(jìn)行配置。為了在AndroidManifest.xml文件中配置、管理Activity,只要為元素添加子元素即可配置Activity。1、建立、配置和使用Activity1.3 啟動、關(guān)

7、閉Activity一個Android應(yīng)用通常都會包括多個Activity,但只有一個Activity會作為程序的入口,該Activity會在Android應(yīng)用運行時,自動啟動并執(zhí)行。至于應(yīng)用中的其他的Activity,通常由入口Activity啟動。Activity啟動其他Activity有如下兩種方法。startActivity(Intent intent):啟動其他的Activity。startActivityForResult(Intent intent,int requestCode ):以指定請求碼(requestCode)啟動Activity,而且程序?qū)鹊叫聠覣ctivity

8、的結(jié)果(通過重寫onActivityResult()方法來獲取)。1、建立、配置和使用Activity Android為關(guān)閉Activity準(zhǔn)備了如下兩個方法。 finish():結(jié)束當(dāng)前Activity finishActivity(int requestCode):結(jié)束以startActivityForResult(Intent intent,int requestCode )方法啟動的Activity。 兩個Activity之間的切換(codes044.1StartActivity)。1、建立、配置和使用Activity1、建立、配置和使用Activity1、建立、配置和使用Activi

9、ty 1.4 使用Bundle在Activity之間交換數(shù)據(jù) 當(dāng)一個Activity啟動另一個Activity時,常常會有一些數(shù)據(jù)要傳遞過去,在Android中,需要傳遞的數(shù)據(jù)放在對象Intent中 Intent提供了多個重載的方法來攜帶額外的數(shù)據(jù) putExtras(Bundle data):向Intent中放入需要攜帶的數(shù)據(jù) 方法中的Bundle是數(shù)據(jù)攜帶包,提供了多個方法存入數(shù)據(jù) putXxx(String key,Xxx data):向Bundle中放入各種類型數(shù)據(jù) putSerializable(String key,Serializable data):向Bundle中放入一個可序

10、列化的對象 為了取出Bundle數(shù)據(jù)攜帶包里的數(shù)據(jù),Bundle提供如下方法 getXxx(String key):從Bundle取出Int、Long等各數(shù)據(jù)類型數(shù)據(jù) getSerializable(String key,Serializable data):從Bundle取出一個可序列化的對象1、建立、配置和使用Activity 例 用第二個Activity處理注冊信息(codes044.1BundleTest)1、建立、配置和使用Activity類似于JavaBean1、建立、配置和使用Activity1.5 啟動其他Activity并返回結(jié)果Activity提供了一個startActiv

11、ityForResult(Intent intent,int requestCode )方法來啟動其他Activity。該方法用于啟動指定的Activity,而且期望獲取指定Activity返回的結(jié)果。為了獲取被啟動的Activity所返回的結(jié)果,當(dāng)前Activity需要重寫onActivityResult(int requestCode,int resultCode,Intent intent)。一個Activity中可能包含多個按鈕,并調(diào)用startActivityForResult()方法來打開多個不同的Activity處理不同的業(yè)務(wù)。當(dāng)這些新Activity關(guān)閉時,系統(tǒng)都會調(diào)用前面Ac

12、tivity的onActivityResult(int requestCode,int resultCode,Intent intent)方法,利用request Code區(qū)分是哪個請求結(jié)果觸發(fā)的,利用resultCode區(qū)分返回的數(shù)據(jù)來自哪個新的Activity。1、建立、配置和使用Activity 例 用第二個Activity讓用戶選擇信息(codes044.1ActivityForResult)1、建立、配置和使用Activity1、建立、配置和使用Activity2、Activity的回調(diào)機(jī)制 Activity被開發(fā)出來,開發(fā)者只要在AndroidManifest.xml文件配置該Ac

13、tivity即可,至于該Activity何時被實例化,方法何時被調(diào)用,開發(fā)者不必關(guān)心。 前面介紹了事件的回調(diào)機(jī)制, Activity的回調(diào)機(jī)制也類似,當(dāng)Activity被部署在Android應(yīng)用中之后,隨著應(yīng)用的運行, Activity會不斷地在不同的狀態(tài)之間切換,該Activity中特定的方法就會被回調(diào)3、Activity的生命周期 當(dāng)Activity處于Android應(yīng)用中運行時,它的活動狀態(tài)由Android以Activity棧的形式管理。當(dāng)前活動的Activity位于棧頂隨著不同應(yīng)用的運行,每個Activity都有可能從活動狀態(tài)轉(zhuǎn)入到非活動狀態(tài),也可以從非活動狀態(tài)轉(zhuǎn)入到活動狀態(tài)。 Act

14、ivity大致會經(jīng)過如下四個狀態(tài)。 運行狀態(tài):當(dāng)前Activity位于前臺,用戶可見,可以獲得焦點 暫停狀態(tài):其他Activity位于前臺,該Activity依然可見,只是不能獲得焦點。 停止?fàn)顟B(tài):該Activity不可見,失去焦點。 銷毀狀態(tài):該Activity結(jié)束,或Activity所在進(jìn)程結(jié)束。 Activity生命周期及相關(guān)回調(diào)方法如下圖所示。3、Activity的生命周期3、Activity的生命周期 在Activity的生命周期中,如下方法會被系統(tǒng)回調(diào)。 onCreate(Bundle savedStasus):創(chuàng)建Activity時被回調(diào)。 onStart():啟動Activit

15、y時被回調(diào)。 onRestart():重新啟動Activity時被回調(diào)。 onResume ():恢復(fù)Activity時被回調(diào)。 onPause():暫停Activity時被回調(diào)。 onStop():停止Activity時被回調(diào)。 onDestroy():銷毀Activity時被回調(diào)。 例 Activity的生命周期(codes044.3Lifecycle)。 3、Activity的生命周期3、Activity的生命周期點擊模擬器中的點擊模擬器中的“退出退出”按鈕后按鈕后LogCat執(zhí)行結(jié)果。執(zhí)行結(jié)果。點擊模擬器中的點擊模擬器中的 鍵后鍵后LogCat執(zhí)行結(jié)果。執(zhí)行結(jié)果。啟動程序運行該啟動程序

16、運行該Activity后后LogCat執(zhí)行結(jié)果。執(zhí)行結(jié)果。4、Activity的四種加載模式 4種Activity的啟動模式: standard:標(biāo)準(zhǔn)啟動模式,每次激活A(yù)ctivity時都會創(chuàng)建Activity,并放入任務(wù)棧中。 singleTop:如果在任務(wù)的棧頂正好存在該Activity的實例, 就重用該實例,否則就會創(chuàng)建新的實例并放入棧頂(即使棧中已經(jīng)存在該Activity實例,只要不在棧頂,都會創(chuàng)建實例)。 singleTask:如果在棧中已經(jīng)有該Activity的實例,就重用該實例(會調(diào)用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出

17、棧。如果棧中不存在該實例,將會創(chuàng)建新的實例放入棧中。 singleInstance:在一個新棧中創(chuàng)建該Activity的實例,并讓多個應(yīng)用共享該棧中的該Activity實例。一旦該模式的Activity實例已經(jīng)存在于某個棧中,任何應(yīng)用再激活該Activity時都會重用該棧中的實例( 會調(diào)用實例的 onNewIntent() )。其效果相當(dāng)于多個應(yīng)用共享一個應(yīng)用,不管誰激活該 Activity 都會進(jìn)入同一個應(yīng)用中。 設(shè)置啟動模式的位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 屬性 相關(guān)的代碼中也有一些標(biāo)志可以使用,比如我

18、們想只啟用一個實例,則可以使用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 標(biāo)志,這個標(biāo)志表示:如果這個activity已經(jīng)啟動了,就不產(chǎn)生新的activity,而只是把這個activity實例加到棧頂來就可以了。 Intent intent = new Intent(); intent.setAction(Action01); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent);4、Activity的四種加載模式什么是Fragment?概述 Fragment

19、表現(xiàn)Activity中UI的一個行為或者一部分。可以把Fragment想象成Activity的一個模塊化區(qū)域,有它自己的生命周期,接收屬于它自己的輸入事件,并且可以在activity運行期間添加和刪除(有點像一個可以在不同的activity中重用的“子activity”)。 Fragment總是必須被嵌入到一個activity中。它們的生命周期直接受其宿主activity的生命周期影響。當(dāng)一個activity正在運行時(處于resumed狀態(tài)),我們可以獨立地操作每一個fragment,比如添加或刪除它們。 引入fragment的目的 在大屏幕設(shè)備上例如平板電腦上,支持更加動態(tài)和靈活的UI設(shè)計

20、。 平板電腦的屏幕要比手機(jī)的大得多,有更多的空間來放更多的UI組件,并且這些組件之間會產(chǎn)生更多的交互。 Fragment提供了這樣的一種設(shè)計:不需要你親自來管理view hierarchy的復(fù)雜變化。通過將activity的布局分散到fragment中,可以在運行時修改activity的外觀,并在activity管理的back stack中保存那些變化。 fragment可以定義自己的布局、生命周期回調(diào)方法,因此可以將fragment重用到多個activity中。這允許你根據(jù)不同的屏幕尺寸或者使用場合改變fragment組合。Fragment生命周期fragment的生命周期,和activit

21、y生命周期很像,事實上,如果你準(zhǔn)備將一個現(xiàn)成的Android應(yīng)用轉(zhuǎn)換到使用fragment,可能只需簡單地將代碼從activity的回調(diào)方法分別移動到fragment的回調(diào)方法 。Fragment生命周期 和activity一樣,fragment可以存在4種狀態(tài):運行狀態(tài)fragment在運行中的activity中可見。 暫停狀態(tài)其他Activity位于前臺,該Fragment依然可見,只是不能獲得焦點停止?fàn)顟B(tài)該Fragment不可見,失去焦點銷毀狀態(tài) 該Fragment被完全刪除,或該Fragment所在的Activity 被結(jié)束Fragment生命周期 和activity一樣,可以使用Bu

22、ndle保持fragment的狀態(tài),如果需要在activity被重新創(chuàng)建的時候恢復(fù)fragment;可以在fragment的 onSaveInstanceState() 期間保存狀態(tài),然后在 onCreate()、onCreateView() 或 onActivityCreated() 期間恢復(fù)它。 activity和fragment的生命周期最顯著的差異是各自如何在它的后臺堆棧中儲存。默認(rèn)情況下,activity在停止后,它會被放到一個由系統(tǒng)管理的用于保存activity的back stack(因此用戶可以使用BACK按鍵導(dǎo)航回退)。但是,當(dāng)你在一個事務(wù)期間移除fragment時,只有顯式調(diào)

23、用addToBackStack()請求保存實例,才會被放到一個由宿主activity管理的back stack。與與activity生命周期的協(xié)調(diào)工作生命周期的協(xié)調(diào)工作 宿主activity的生命周期,直接影響到fragment的生命周期,以致每一個activity的生命周期的回調(diào)行為都會引起每一個fragment中類似的回調(diào)。 與與activity生命周期的協(xié)調(diào)工作生命周期的協(xié)調(diào)工作 為了執(zhí)行例如創(chuàng)建和銷毀fragment的UI的動作,相比Activity Fragment有一些額外的生命周期回調(diào)方法,它們是處理與activity交互的唯一渠道。這些額外的回調(diào)方法是:onAttach()當(dāng)f

24、ragment被綁定到activity時被調(diào)用(Activity會被傳入)。 onCreateView()每次創(chuàng)建、繪制該Fragment的View組件時回調(diào)該方法。onActivityCreated()當(dāng)activity的onCreate()方法返回時被調(diào)用。 onDestroyView()銷毀該Fragment時被回調(diào)。該方法只會被回調(diào)一次。 onDetach()當(dāng)fragment從activity解除關(guān)聯(lián)時被調(diào)用。 如何使用Fragment創(chuàng)建fragment 要創(chuàng)建一個fragment,必須創(chuàng)建一個 Fragment 的子類(或者是一個已存在的它的子類)。 通常,應(yīng)當(dāng)至少實現(xiàn)如下的生命

25、周期方法:onCreate()當(dāng)創(chuàng)建fragment時,系統(tǒng)調(diào)用此方法。在實現(xiàn)代碼中,應(yīng)當(dāng)初始化想要在fragment中保持的必要組件,當(dāng)fragment被暫?;蛘咄V购罂梢曰謴?fù)。 onCreateView()fragment第一次繪制它的用戶界面的時候,系統(tǒng)會調(diào)用此方法。為了繪制fragment的UI,此方法必須返回一個作為fragment布局的根的view。如果fragment不提供UI,可以返回null。 onPause()用戶將要離開fragment時,系統(tǒng)調(diào)用這個方法作為第一個指示(雖然它并非總是意味著fragment將被銷毀)。在當(dāng)前用戶會話結(jié)束之前,通常應(yīng)當(dāng)在這里提交任何應(yīng)該持久

26、化的變化(因為用戶有可能不會返回)。 創(chuàng)建fragmentpublic static class ExampleFragment extends Fragment Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) / Inflate the layout for this fragment return inflater.inflate(R.layout.example_fragment, container, false); 傳入

27、 onCreateView() 的 container 參數(shù)是你的fragment layout將要插入的父ViewGroup(來自activity的layout)。savedInstanceState 參數(shù)是一個 Bundle,如果fragment是被恢復(fù)的,它提供關(guān)于fragment的之前的實例的數(shù)據(jù)()。 注意:inflate() 方法的第三個參數(shù)指示在加載期間,展開的layout是否應(yīng)當(dāng)附著到ViewGroup (第二個參數(shù))。傳入true會在最后的layout中創(chuàng)建一個多余的view group。 將將fragment添加到添加到activity有2種方法可以添加一個fragment

28、到activity layout: 一、在activity的layout文件中聲明fragment 將將fragment添加到添加到activity 中的 android:name 屬性指定了在layout中實例化的Fragment類。 當(dāng)系統(tǒng)創(chuàng)建這個activity layout時,它實例化每一個在layout中指定的fragment,并調(diào)用它們的onCreateView()方法,來獲取每一個fragment的layout,系統(tǒng)將從fragment返回的 View 直接插入到元素所在的地方。 注意:每一個fragment都需要一個唯一的標(biāo)識,如果activity重啟,系統(tǒng)可以用來恢復(fù)frag

29、ment(并且你也可以用來捕獲fragment來處理事務(wù),例如移除它。) 有3種方法來為一個fragment提供一個ID:為 android:id 屬性提供一個唯一ID。 為 android:tag 屬性提供一個唯一字符串。 如果以上2個都未提供,系統(tǒng)將使用容器view的ID。 將將fragment添加到添加到activity二、撰寫代碼將fragment添加到一個已存在的ViewGroup FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = frag

30、mentManager.beginTransaction(); ExampleFragment fragment = new ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTmit(); add()的第一個參數(shù)是fragment要放入的ViewGroup,由resource ID指定,第二個參數(shù)是需要添加的fragment。一旦用FragmentTransaction作了改變,需要調(diào)用commit()使改變生效。將將fragment添加到添加到activity fra

31、gment也可以用來為activity提供后臺行為而不用展現(xiàn)額外的UI。需要使用 add(Fragment, String) 來添加 fragment (第二個參數(shù)為fragment提供一個唯一的字符串tag)。這么做雖然添加了fragment,但因為它沒有關(guān)聯(lián)到一個activity layout中的某個view,所以不會接收到onCreateView()調(diào)用。因此不必實現(xiàn)此方法。Fragment的管理 要在activity中管理fragment,需要使用FragmentManager。可以通過調(diào)用activity的getFragmentManager()取得它的實例。 可以通過Fragmen

32、tManager做的事情包括:使用findFragmentById() (適用于在activity layout中提供UI的fragment)或findFragmentByTag() (適用于有或沒有UI的fragment)獲取activity中存在的fragment。 使用 popBackStack(),將fragment從后臺堆棧中彈出(模擬用戶的BACK 命令)。 使用addOnBackStackChangeListener()注冊一個監(jiān)聽后臺堆棧變化的listener。 執(zhí)行執(zhí)行Fragment事務(wù)事務(wù) 根據(jù)用戶的交互情況,對fragment進(jìn)行添加、移除、替換、以及執(zhí)行其他動作。提交

33、給activity的每一套變化被稱為一個事務(wù),使用FragmentTransaction API執(zhí)行。 Fragment newFragment = new ExampleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); mit(); 注意:調(diào)用addToBackStack(),可以將事務(wù)

34、添加到一個fragment事務(wù)的back stack,這個back stack由activity管理,并允許用戶通過按下 BACK 按鍵返回。 執(zhí)行執(zhí)行Fragment事務(wù)事務(wù) 可以在一個給定的事務(wù)中設(shè)置你想執(zhí)行的所有變化,使用諸如 add()、remove()、以及replace()。然后要提交事務(wù)到activity,必須調(diào)用 commit()。添加變化到 FragmentTransaction的順序并不重要,除以下例外:必須最后調(diào)用 commit()。 如果添加多個fragment到同一個容器,那么添加的順序決定了它們在view hierarchy中顯示的順序。 注意: 只能在activi

35、ty保存它的狀態(tài)(當(dāng)用戶離開activity)之前使用commit()提交事務(wù)。與與Activity通信通信 fragment可以使用 getActivity() 獲得Activity實例 activity可以通過從FragmentManager獲得一個到Fragment的引用來調(diào)用fragment中的方法,使用 findFragmentById() 或 findFragmentByTag() 。 ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 與activity分享事件 在一些情

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論