《Android實戰基礎教程》課件第十章_第1頁
《Android實戰基礎教程》課件第十章_第2頁
《Android實戰基礎教程》課件第十章_第3頁
《Android實戰基礎教程》課件第十章_第4頁
《Android實戰基礎教程》課件第十章_第5頁
已閱讀5頁,還剩62頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

目錄10.1Fragment在項目中的使用10.2控件交互在項目中的使用10.3RecyclerView在項目中的使用

十、

習慣記錄系統十、習慣記錄系統Fragment是Android3.0引入的新API,它代表了Activity的子模塊,它必須被“嵌入”Activity中使用,因此雖然Fragment擁有自己的生命周期,但Fragment的生命周期會受到它所在的Activity的生命周期控制。10.1Fragment在項目中的使用10.1.1Fragment介紹十、習慣記錄系統Fragment的特征:

作為Activity界面的組成部分。Fragment可調用getActivity()方法獲取它所在的Activity,Activity可調用FragmentManager的findFragmentById()或findFragmentByTag()方法來獲取Fragment。

在Activity運行過程中,可調用FragmentManager的add()、remove()、replace()方法動態地添加、刪除或替換Fragment。

一個Activity可以同時組合多個Fragment;反過來,一個Fragment也可以被多個Activity復用。十、習慣記錄系統Fragment存在四種生命周期狀態:

活動狀態:當前Fragment位于前臺,用戶可見,可以獲得焦點。

暫停狀態:其他Activity位于前臺,該Fragment依然可見,只是不能獲得焦點。

停止狀態:該Fragment不可見,失去焦點。

銷毀狀態:該Fragment被完全刪除,或該Fragment所在的Activity被結束。10.1.2Fragment的生命周期十、習慣記錄系統右圖顯示了Fragment生命周期及相關回調方法。從圖可以看出,在Fragment生命周期中,一些方法會被回調。

開發Activity時可以根據需要選擇性地覆蓋指定方法,開發Fragment時也可根據需要選擇性地覆蓋指定方法,其中最常見的就是覆蓋onCreateView()方法,該方法返回的View將由Fragment顯示出來。圖10.1十、習慣記錄系統APP中需要一個Activity來管理一個CrimeFragment,用來顯示習慣列表。這個Activity名為CrimeActivity,同時創建一個習慣類,用于表示每個習慣,習慣流程圖如圖。10.1.3習慣記錄系統創建圖10.2十、習慣記錄系統

在圖10.3中將展示該APP的對象圖標,以及第一個版本所需要用到的相關類。有三個類展示出來,將完成:Crime、CrimeFragment、CrimeActivity。(1)一個Crime對象將表示一個辦公室習慣。在這一節中,一個習慣僅僅包含一個標題和一個id。標題是習慣的描述性內容。id標記一個獨特的Crime實例。(2)CrimeFragment:有一個成員變量(mCrime);界面由一個LinearLayout和一個EditText組成;CrimeFragment包含一個EditExt的成員變量(mTitleField),同時為它設置了監聽器由于監聽內容的改變。(3)CrimeActivity的界面由FrameLayout組成,在FrameLayout區域顯示Fragment的內容。十、習慣記錄系統圖10.3十、習慣記錄系統

創建一個新的Android項目,項目名字為CriminalIntent,包名為com.alex.criminalIntent,最低版本選擇API14,編譯版本默認選擇最高編譯版本:圖10.4十、習慣記錄系統

點擊Next,創建CrimeActivity,最后點擊完成:圖10.5十、習慣記錄系統

在支持包中有兩個非常重要的類:Fragment和FragmentActivity。使用Fragment時需要Activity知道如何管理Fragment,而FragmentActivity就是用于管理支持包中的Fragment的。

由于項目創建時會自動包含V4支持包,因此可以直接使用支持包中的Fragment。

在項目packageexplorer視圖中,打開CrimeActivity.java,改變CrimeActivity的繼承類為FragmentActivity。代碼如下:10.1.4Fragment與支持包十、習慣記錄系統

現在創建Model層的實體類Crime,選擇包名,單擊右鍵創建類Crime。

在Crime.java中,添加如下代碼:十、習慣記錄系統十、習慣記錄系統

1.代管Fragment

使用Activity管理一個UIFragment時需要注意以下兩點:(1)在Activity布局文件中給Fragment指定一個區域顯示。(2)管理Fragment實例的生命周期。2.兩種方式代管Fragment(1)在Activity的布局文件中增加Fragment。(2)在Activity的代碼中添加Fragment。10.1.5Fragment的應用十、習慣記錄系統3.定義一個containerView

首先在Activity的代碼中添加一個Fragment,但是在這之前必須在Activity的View層級樹中為Fragment指定一塊顯示區域。CrimeActivity的布局文件如下所示:

至此,我們可以通過代碼把Fragment插入到這個FrameLayout中,但在此之前,需要創建一個Fragment。十、習慣記錄系統4.創建Fragment創建Fragment的步驟與創建Activity的步驟:(1)通過布局文件創建用戶界面。(2)創建一個類,同時將布局文件綁定為它的View。(3)在代碼中獲得布局文件中的控件進行操作。十、習慣記錄系統5.定義CrimeFragment的布局Crime實例的消息將通過CrimeFragment展示出來,包括文字、圖片等等。在Fragment的布局文件中,只需要一個EditText控件。EditText是一個用戶可以增加和編輯文本的控件。Fragment_xml布局文件代碼如下:十、習慣記錄系統十、習慣記錄系統6.創建CrimeFragment

在項目中創建CrimeFragment,使之繼承Fragment類,需要注意的是,Fragment有兩個不同包名的Fragment類,一個為Fragment(android.app),一個為Fragment。前者是一個由Android自帶的Fragment,需要的是支持包版本的Fragment,所以選擇android.support.v4.app版本的Fragment:十、習慣記錄系統7.實現Fragment生命周期方法CrimeFragment是模型與視圖交互的控制器。該類的主要工作是顯示習慣詳情以及更新。這些控制內容主要在生命周期方法中實現,這些生命周期方法與Activity類似,比如OnCreate(Bundle)方法。

在CrimeFragment.java中增加Crime成員對象和一個繼承的onCreate()方法,代碼如下所示:十、習慣記錄系統(1)Fragment的onCreate(Bundle)方法是public修飾的方法,而Activity的onCreate(Bundle)方法是protected修飾,這是因為Fragment的生命周期方法會被代管的Activity所調用。(2)?Fragment與Activity一樣也可以通過Bundle對象保存獲取狀態。

在CrimeFragment.java中增加繼承生命周期方法onCreateView()來加載布局文件。代碼如下:十、習慣記錄系統十、習慣記錄系統FragmentManager可以處理兩個事情:Fragment集合和Fragment事務的回退棧。在本案例中,只需要關注Fragment集合。在CrimeActivity.java中增加以下代碼:十、習慣記錄系統8.FragmentTransactions

通過FragmentManager可以將Fragment添加進去并管理此Fragment。十、習慣記錄系統

在上述代碼中,fm.beginTransaction()方法創建并且返回一個FragmentTransaction實例,該實例在配置FragmentTransaction時使用流接口返回FragmentTransaction而不是返回void,這樣在配置FragmentTransaction時可以連著一起寫然后再提交。Add()方法是FragmentTransaction事務管理方法之一。它有兩個參數:容器id和需要管理的Fragment。在本案例中是R.id.fragment_container以及CrimeFragment。

帶有id的容器空間主要有兩個目的:(1)通知FragmentManager代管的Fragment出現在Activity界面的哪個區域。(2)在FragmentManager的集合中作為Fragment的獨一無二的標識符用于區分。

當需要從FragmentManager中得到CrimeFragment時,可以通過容器id得到。十、習慣記錄系統

通過FragmentManager的findFragmentById()方法得到Fragment。如果在FragmentManager中沒有Fragment,則創建一個新的;有則直接返回該對象。十、習慣記錄系統運行程序:圖10.6十、習慣記錄系統

在Eclipse中打開Crime.java類,增加兩個屬性mDate和mSolved,mDate表示習慣發生的時間,而mSolved表示習慣是否已經解決。在Crime.java中增加代碼如下所示:10.2控件交互在項目中的使用10.2.1更新Crime十、習慣記錄系統

在Eclipse中Date類自動導包時注意需要導入java.util.Date,否則將會報錯。在Crime的構造方法中得到mDate對象,接下來對mDate、mSolve進行封裝,添加get、set方法。在Crime中增加代碼如下所示:十、習慣記錄系統

更新布局文件的代碼:10.2.2更新Crime十、習慣記錄系統十、習慣記錄系統

上面的Button沒有給該控件初始化文字。這個按鈕的功能是展示習慣發生日期,將在代碼中初始化文字。

在上述代碼中又用到一些字符串資源,字符串代碼修改如下:十、習慣記錄系統

在CrimeFragment.java中更新代碼,對布局代碼更新的控件進行連接,增加兩個成員變量代碼如下:10.2.3連接控件十、習慣記錄系統

在onCreateView()方法中得到布局文件的button實例,再讓button按鈕顯示日期。在onCreateView方法中增加了對CheckBox的事件監聽以及相應的處理。自此,布局文件的更新已經完成。十、習慣記錄系統

在本節中,我們將更新習慣記錄列表。這個列表將展示每一個習慣的標題、時間以及是否已經解決。展示習慣列表需要在應用的控制層(Controller)更新Activity和Fragment,在模型層(Model)也增加新的實體類CrimeLab,在此實體類中將保存Crime對象集合。在View層,將使用一個新的控件RecyclerView,通過此控件展示習慣列表,如圖10.7所示。10.3RecyclerView在項目中的使用十、習慣記錄系統圖10.7十、習慣記錄系統

更新該應用的Model層就是將單個Crime對象更新為Crime對象列表。在這里將通過單例來存儲Crime列表。單例類是指該類只能被創建一次。

當需要創建單例時,該類的構造方法必須為私有的,同時提供靜態的get()方法。如果實例已經存在,通過get()方法得到該對象;如果實例不存在,get()方法將調用構造器創建一個實例。代碼如下:10.3.1更新應用Model層十、習慣記錄系統

在CrimeLab類中,定義了一個靜態的成員變量sCrimeLab,同時構造方法也適用,當其他類需要CrimeLab時,只需要調用靜態方法get()就可以得到實例對象。十、習慣記錄系統

給CrimeLab添加一些Crime對象用于存儲。在CrimeLab的構造方法中,創建一個空的Crimes集合,同時增加兩個方法:getCrimes()和getCrime(UUID),前者返回一個Crime集合,后者返回一個Crime對象:十、習慣記錄系統

給mCrimes的集合增加數據,在構造方法中增加代碼:十、習慣記錄系統1.使用一個抽象Activity代管Fragment

創建CrimeListActivity類來代管CrimeListFragment。第一步需要為CrimeListActivity創建界面布局。在前面的CrimeActivity中,我們使用activity_crime.xml作為布局文件,這個布局文件將FrameLayout作為容器。但是activity_crime.xml僅僅提供了一個容器,沒有其他控件,可以將它作為一個通用的Fragment的布局文件,將此文件重命名為activity_fragment.xml。這樣當Activity僅作為Fragment的代管者時,都可以使用該布局文件。記得在之前的CrimeActivity.java的onCreate()方法中修改setContentView()參數。十、習慣記錄系統

在創建CrimeListActivity時,可以重用前面CrimeActivity的代碼。在CrimeActivity的代碼中,當需要代管一個Fragment時,唯一不同的是Fragement對象的不同。為了避免代碼重復,可以定義一個抽象類。

在應用中創建一個抽象類SingleFragmentActivity,同時繼承FragmentActivity。通過一個抽象方法得到Fragment對象,這樣其子類只需要實現該抽象方法就能得到Fragment對象。十、習慣記錄系統十、習慣記錄系統3.使用抽象類

改變前面所寫的CrimeActivity類,將CrimeActivity的父類改變為SingleFragment-Activity,刪除其實現的onCreate()方法,同時實現父類的SingleFragmentActivity的createFragment()方法:十、習慣記錄系統4.創建新的控制器

創建新的控制器類CrimeListActivity和CrimeListFragment,并實現其父類的方法。

CrimeListFragment繼承了支持包的Fragment,暫時無方法。代碼如下:十、習慣記錄系統5.注冊CrimeListActivityCrimeListActivity通過代碼繼承SingleFragmentActivity之后,需要在清單文件中注冊該Activity,將CrimeListActivity作為其登錄界面,只需要在其注冊文件中增加上述代碼中的<intent-filter>即可。十、習慣記錄系統RecyclerView的功能是回收TextView以及將它們部署到屏幕上。此處需要用到兩個類:一個Adapter的子類以及一個ViewHolder的子類。相比而言,ViewHolder的工作量更小,所以先講述ViewHolder的功能。ViewHolder做的主要事情如圖所示。在ListView中,在其適配器的getView方法中,ListView需要展示多少個item就需要創建多少個item的View對象;而在RecyclerView中,RecyclerView并不直接創建View對象,而是通過創建RecyclerView對象,通過RecyclerView對象對View的引用來減少內存中對象個數以及訪問布局文件的次數。10.3.2RecyclerView、Adapter和ViewHolder圖10.81.ViewHolderAndroidAdapter十、習慣記錄系統2.AdapterAdapter是一個控制器類,它是RecyclerView和數據之間的橋梁,通過Adapter將數據顯示到RecyclerView界面中。RecyclerView的適配器主要負責:

創建需要的ViewHolder。

將model的數據綁定到ViewHolder中。

創建RecyclerView的適配器需要繼承RecyclerView.Adapter,通過此適配器將把CrimeLab中的Crime集合顯示到RecyclerView上。

當RecyclerView需要展示一個View對象時,它將與Adapter聯系。圖10.9列出了RecyclerView與Adpter的聯系調用關系。十、習慣記錄系統

首先,RecyclerView調用Adapter的getItemCount()方法來知曉有多少個item。

接下來,RecyclerView得到item的數目后,調用Adapter的createViewHolder(ViewGroup,int)方法來創建新的ViewHolder。

最后,RecyclerView調用onBindViewHolder(ViewHolder,int)。圖10.9十、習慣記錄系統RecyclerView是Android支持庫中的一個類,故使用RecyclerView的第一步就是導入對應的支持庫。在SDK的文件目錄中找到extras文件夾,找到v7包中對應的android-support-v7-recyclerview.jar文件并將其導入到項目中即可。

在res/layout目錄下,創建fragment_crime_list布局文件,同時修改其根容器為RecyclerView:10.3.3使用RecyclerView十、習慣記錄系統

同時在CrimeListFragment中做修改:十、習慣記錄系統1.實現Adapter和ViewHolder

在CrimeListFragment中定義一個集成ViewHolder的內部類:十、習慣記錄系統

在CrimeListFragment內創建RecyclerView.Adapter的繼承類CrimeAdapter:十、習慣記錄系統Adapter創建完成之后,只需要將該Adapter傳遞給RecylerView即可。在CrimeListFragment中增加updateUI()方法,并添加到onCrea

溫馨提示

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

評論

0/150

提交評論