版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Android綜合應(yīng)用開發(fā)XXX課程介紹Android入門Android組件Android布局Activity數(shù)據(jù)存儲(chǔ)BroadcastReceiverServiceContentProvider網(wǎng)絡(luò)編程Android項(xiàng)目課前準(zhǔn)備安裝開發(fā)環(huán)境(JDK1.8,AndroidStudio3.5)下載網(wǎng)址:/課程要求學(xué)習(xí)時(shí)間:課表技術(shù)學(xué)習(xí)交流QQ群學(xué)習(xí)通課程考核要求成績=平時(shí)成績50%+考試成績50%平時(shí)成績包括:出勤,作業(yè),實(shí)驗(yàn)報(bào)告,課堂表現(xiàn)考試成績:期末課程項(xiàng)目設(shè)計(jì)報(bào)告和項(xiàng)目源碼學(xué)習(xí)要求每周按時(shí)學(xué)習(xí),完成學(xué)習(xí)任務(wù)多編碼,多思考Justdoit!第一章:Android開發(fā)起步主要內(nèi)容1)了解Android的發(fā)展和歷史。2)掌握Android的系統(tǒng)架構(gòu)。3)掌握如何搭建Android開發(fā)環(huán)境。4)掌握Android應(yīng)用的目錄結(jié)構(gòu)。5)掌握第一個(gè)Android應(yīng)用的編寫和運(yùn)行。6)了解Android應(yīng)用程序的調(diào)試與打包。Android的歷史和發(fā)展Android的發(fā)展與前景如果大家去過位于美國加利福尼亞州山景城的谷歌公司總部,一定會(huì)被大樓草坪上的綠色機(jī)器人和各種甜點(diǎn)雕塑所吸引,這便是Android系統(tǒng)的吉祥物和各個(gè)版本代號(hào)。顯然,在2005年收購Android,可能是谷歌最正確的投資之一。時(shí)至今日,Android已經(jīng)是家喻戶曉的移動(dòng)平臺(tái),也是谷歌公司最為重要的業(yè)務(wù)之一。有趣的是,幾乎每一個(gè)Android版本代號(hào),都是一種美味的甜點(diǎn),這也讓原本冷冰冰的操作系統(tǒng)更具人文氣息。Android的歷史和發(fā)展Android的發(fā)展與前景讀者看到表格時(shí),其中數(shù)據(jù)很可能已經(jīng)發(fā)生了變化,因?yàn)锳ndroid平臺(tái)的更新速度相當(dāng)快,相信實(shí)際生活中使用Android手機(jī)的用戶都有同感。而Android平臺(tái)之所以發(fā)展迅速,與其自身優(yōu)勢是分不開的,其開源性、硬件豐富性以及開發(fā)便捷性,注定其未來前景大好,發(fā)展迅速。Android的歷史和發(fā)展Android的系統(tǒng)架構(gòu)Android系統(tǒng)的底層建立在Linux系統(tǒng)之上,該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件4層組成,它采用一種被稱為軟件疊層(SoftwareStack)的方式進(jìn)行構(gòu)建。這種軟件疊層結(jié)構(gòu)使得層與層之間相互分離,明確各層的分工。這種分工保證了層與層之間的低耦合,當(dāng)下層的層內(nèi)或?qū)酉掳l(fā)生改變時(shí),上層應(yīng)用層序無需任何改變。1.應(yīng)用程序?qū)?/p>
Android系統(tǒng)包含一系列的應(yīng)用程序(Application),包括電子郵件客戶端、SMS程序、日歷、聯(lián)系人等。這些都是手機(jī)系統(tǒng)里自帶的系統(tǒng)APP,也是本書要講解的主要內(nèi)容:編寫Android系統(tǒng)上的應(yīng)用程序。Android的系統(tǒng)架構(gòu)Android的歷史和發(fā)展Android的系統(tǒng)架構(gòu)2.應(yīng)用程序框架本書要講解的內(nèi)容是開發(fā)Android系統(tǒng)的APP,而在實(shí)際開發(fā)時(shí),APP開發(fā)是面向底層的應(yīng)用程序框架(ApplicationFramework)進(jìn)行的。3.函數(shù)庫Android包含一套被不同組件所使用的C/C++庫的集合。一般來說,Android應(yīng)用開發(fā)者不能直接調(diào)用這套C/C++庫集,但可以通過它上面的應(yīng)用程序框架Framework來調(diào)用這些庫。下面列出一些核心庫。Android的歷史和發(fā)展Android的系統(tǒng)架構(gòu)(1)系統(tǒng)C庫:一個(gè)從BSD(BerkeleySoftwareDistribution)系統(tǒng)派生出來的標(biāo)準(zhǔn)C系統(tǒng)庫(libc),并且專門為嵌入式Linux設(shè)備調(diào)整過。(2)媒體庫:基于PacketVideo的OpenCORE,這套媒體庫支持播放和錄制許多流行的音頻和視頻格式,甚至可以查看靜態(tài)圖片。(3)SurfaceManager:管理對(duì)顯示子系統(tǒng)的訪問,并可以對(duì)多個(gè)應(yīng)用程序的2D和3D圖層提供無縫整合。(4)LibWebCore:一個(gè)全新的Web瀏覽器引擎,該引擎對(duì)Android瀏覽器提供支持,也為WebView提供支持,WebView完全可以嵌入到開發(fā)者自己的應(yīng)用程序中。后面的章節(jié)會(huì)對(duì)WebView進(jìn)行介紹。(5)SGL:底層的2D圖形引擎。Android的歷史和發(fā)展Android的系統(tǒng)架構(gòu)(6)3Dlibraries:基于OpenGLESAPI實(shí)現(xiàn)的3D系統(tǒng),這套3D庫既可以使用硬件3D加速(如果硬件支持),也可以使用高度優(yōu)化的軟件3D加速。(7)FreeType:位圖和向量字體顯示。(8)SQLite:供所有應(yīng)用程序使用的功能強(qiáng)大的輕量級(jí)關(guān)系型數(shù)據(jù)庫。4.Android運(yùn)行時(shí)Android運(yùn)行時(shí)(AndroidRuntime)由兩部分組成:Android核心庫集和虛擬機(jī)ART。其中核心庫集提供了Java語言的核心庫所能使用的絕大部分功能,而虛擬機(jī)ART則負(fù)責(zé)運(yùn)行所有的應(yīng)用程序。Android的歷史和發(fā)展Android的系統(tǒng)架構(gòu)5.Linux內(nèi)核Android系統(tǒng)建立在Linux2.6之上,Linux內(nèi)核(LinuxKernel)提供了安全性、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型等核心系統(tǒng)服務(wù)。除此之外,它也是系統(tǒng)硬件和軟件疊層之間的抽象層。搭建Android開發(fā)環(huán)境“工欲善其事,必先利其器”,選擇一款好的開發(fā)工具能很大幅度地提升開發(fā)效率。Android平臺(tái)官方推薦的開發(fā)工具當(dāng)屬AndroidStudio,本節(jié)將詳細(xì)講解Android開發(fā)環(huán)境的搭建方法以及AndroidStudio的安裝步驟。搭建Android開發(fā)環(huán)境JDK。JDK全稱是JavaDevelopmentKit,是Java語言的軟件開發(fā)工具包,它包括了Java的運(yùn)行環(huán)境、工具集合、基礎(chǔ)類庫等內(nèi)容。AndroidSDK。AndroidSDK是谷歌提供的安卓開發(fā)工具包,此包專門為安卓開發(fā)提供,包含了大量Android相關(guān)的API供開發(fā)者開發(fā)使用。AndroidStudio。這款開發(fā)工具是2013年由谷歌官方推出的,經(jīng)過幾年的發(fā)展,其穩(wěn)定性也大大增強(qiáng),可以說已經(jīng)完全取代了之前使用插件的形式在Eclipse上開發(fā)安卓應(yīng)用的形式。
搭建Android開發(fā)環(huán)境AndroidStudio中已經(jīng)有集成了JDK和SDK的版本,不過還是建議大家JDK部分親自動(dòng)手安裝,因?yàn)閷W(xué)習(xí)Android開發(fā)必須要有Java基礎(chǔ),而安裝JDK也是學(xué)習(xí)Java必須經(jīng)歷的過程。搭建Android開發(fā)環(huán)境搭建開發(fā)環(huán)境(1)下載和安裝JDK8。之所以要下載JDK8,是因?yàn)楝F(xiàn)在AndroidStudio的最新版本要求必須是JDK8版本,否則編譯Android項(xiàng)目時(shí)會(huì)報(bào)錯(cuò)。JDK8的下載地址為/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,直接訪問該地址就可以下載,該地址打開后如圖所示。搭建Android開發(fā)環(huán)境如果使用的計(jì)算機(jī)是32位Windows操作系統(tǒng),應(yīng)選擇Windowsx86版本。下載完成之后雙擊下載的文件開始安裝,安裝開始界面如圖所示。搭建Android開發(fā)環(huán)境可以把JDK統(tǒng)一放在Java文件夾中,通過【更改】按鈕就可以實(shí)現(xiàn)。注意安裝路徑中不要有中文,最好也不要有空格或特殊符號(hào)。路徑確定之后,單擊【下一步】按鈕,開始安裝JDK。安裝完成后會(huì)進(jìn)入安裝完成界面,如圖所示。單擊【關(guān)閉】按鈕,關(guān)閉當(dāng)前界面,完成JDK的安裝。搭建Android開發(fā)環(huán)境
搭建開發(fā)環(huán)境安裝完成之后打開Java文件夾如圖所示。(2)配置環(huán)境變量。右擊【我的電腦】→【屬性】選項(xiàng),進(jìn)入顯示系統(tǒng)基本信息的系統(tǒng)窗口。搭建Android開發(fā)環(huán)境1.2.2搭建開發(fā)環(huán)境單擊【高級(jí)系統(tǒng)設(shè)置】,打開【系統(tǒng)屬性】對(duì)話框,如圖所示。單擊【環(huán)境變量】按鈕,打開【環(huán)境變量】對(duì)話框,如圖所示。
搭建Android開發(fā)環(huán)境搭建Android開發(fā)環(huán)境AndroidStudio的安裝AndroidStudio可以在Android官網(wǎng)上下載,具體下載地址是/studio/index.html。在頁面找到AndroidStudio并下載完成后,雙擊.exe文件開始安裝,安裝過程很簡單,連續(xù)單擊Next按鈕即可。開始安裝界面如圖所示。搭建Android開發(fā)環(huán)境AndroidStudio的安裝單擊Next按鈕開始安裝。接下來選擇安裝組件時(shí)建議全選安裝,如圖所示。單擊Next按鈕,進(jìn)入選擇安裝AndroidStudio的安裝地址以及AndroidSDK的安裝地址,根據(jù)計(jì)算機(jī)的實(shí)際情況選擇即可,如圖所示。
搭建Android開發(fā)環(huán)境AndroidStudio的安裝之后的步驟全部保持默認(rèn)選項(xiàng)即可。安裝完成之后如圖所示。單擊Finish按鈕,若勾選了StartAndroidStudio選項(xiàng)則會(huì)直接打開AndroidStudio。首次啟動(dòng)AndroidStudio會(huì)提醒用戶選擇是否導(dǎo)入之前AndroidStudio版本的配置,如圖所示。因?yàn)槭鞘状伟惭b,故選擇不導(dǎo)入即可。搭建Android開發(fā)環(huán)境AndroidStudio的安裝單擊OK按鈕,進(jìn)入歡迎頁面,如圖所示。單擊Next按鈕進(jìn)入選擇安裝類型頁面,如圖所示。在這個(gè)頁面選擇AndroidStudio的安裝類型,有Standard和Custom兩種選擇。Standard表示一切都使用默認(rèn)的配置,比較方便;Custom則表示可以根據(jù)用戶的特殊要求進(jìn)行自定義。由于是首次安裝,選擇Standard類型即可。單擊Next按鈕完成選擇。搭建Android開發(fā)環(huán)境AndroidStudio的安裝選擇完成之后AndroidStudio即安裝完成。之后Studio會(huì)嘗試聯(lián)網(wǎng)下載一些更新,等待更新完成之后單擊Finish按鈕就會(huì)進(jìn)入如圖所示界面。目前為止,Android開發(fā)環(huán)境就已經(jīng)全部搭建完成。接下來就開始創(chuàng)建第一個(gè)Android應(yīng)用。開始第一個(gè)安卓應(yīng)用1.3.1創(chuàng)建HelloWorld項(xiàng)目在上圖所示界面中選擇StartanewAndroidStudioproject,進(jìn)入創(chuàng)建新項(xiàng)目界面圖中,Applicationname表示應(yīng)用名稱,是該項(xiàng)目安裝到手機(jī)上之后顯示在圖標(biāo)下面的名稱,這里填入HelloWorld。Companydomain表示公司域名,如果是公司的項(xiàng)目,建議填入“公司名.com”,這里先填入。Packagename表示項(xiàng)目的包名,在Android項(xiàng)目中是通過包名來區(qū)分不同的項(xiàng)目的,故命名包名稱時(shí)一定要注意其唯一性。默認(rèn)的Packagename是AndroidStudio通過應(yīng)用名稱和公司域名的組合生成的,如果不想使用默認(rèn)的包名,可以單擊右側(cè)的Edit按鈕修改。開始第一個(gè)安卓應(yīng)用創(chuàng)建HelloWorld項(xiàng)目接下來單擊Next按鈕對(duì)項(xiàng)目的最低兼容版本進(jìn)行設(shè)置,如圖所示。Android4.0以上的系統(tǒng)已經(jīng)占據(jù)了絕大部分市場份額,因此這里將MinimumSDK指定為API15。本書主要針對(duì)手機(jī)端開發(fā),因此勾選PhoneandTablet復(fù)選框。接著單擊Next按鈕跳轉(zhuǎn)到創(chuàng)建Activity頁面,如圖所示。
開始第一個(gè)安卓應(yīng)用創(chuàng)建HelloWorld項(xiàng)目如果安裝的是Android2.3及以上的版本,可供選擇的模板較多,大家在實(shí)際項(xiàng)目中可根據(jù)需要自行選擇。在這里選擇EmptyActivity來創(chuàng)建一個(gè)空的Activity。選擇之后單擊Next按鈕,進(jìn)入該Activity以及其對(duì)應(yīng)的layout頁面命名界面,如圖所示。開始第一個(gè)安卓應(yīng)用創(chuàng)建HelloWorld項(xiàng)目界面中ActivityName根據(jù)駝峰命名規(guī)范自行填寫,這里填入HelloWorldActivity,AndroidStudio自動(dòng)填入LayoutName,如果不想用默認(rèn)的命名,可以自行修改。命名填寫完成之后單擊Finish按鈕。等待AndroidStudio創(chuàng)建好項(xiàng)目,至此,第一個(gè)Android應(yīng)用創(chuàng)建完成,如圖所示。開始第一個(gè)安卓應(yīng)用啟動(dòng)Android模擬器大家應(yīng)該發(fā)現(xiàn)了,從第一個(gè)項(xiàng)目開始創(chuàng)建到創(chuàng)建完成,一行代碼也沒有編寫。這是因?yàn)閯?chuàng)建項(xiàng)目時(shí),AndroidStudio自動(dòng)生成了很多東西,大大簡化了工作重復(fù)度。但是要運(yùn)行一個(gè)項(xiàng)目就必須要有一個(gè)載體,可以是一部手機(jī),也可以是Android模擬器?,F(xiàn)在就來使用Android模擬器來運(yùn)行程序。首先創(chuàng)建一個(gè)Android模擬器,觀察AndroidStudio頂部工具欄圖標(biāo),單擊AVDManager圖標(biāo),會(huì)出現(xiàn)創(chuàng)建和啟動(dòng)模擬器界面,如圖所示。開始第一個(gè)安卓應(yīng)用
啟動(dòng)Android模擬器由于是第一次創(chuàng)建,所以模擬器列表為空,單擊CreateVirtualDevice按鈕開始創(chuàng)建模擬器,如圖所示??梢钥吹接泻芏嘣O(shè)備可供選擇,在最左邊一欄選擇Phone,默認(rèn)選擇Nexus5X這臺(tái)設(shè)備的模擬器,不做更改,直接單擊Next按鈕,開始選擇模擬器的系統(tǒng)版本,如圖所示。開始第一個(gè)安卓應(yīng)用
啟動(dòng)Android模擬器這里試試最新的Android8。如果選擇其他版本,單擊左側(cè)的Download下載相應(yīng)的版本安裝即可。單擊Next按鈕確認(rèn)模擬器的配置,如果沒有特殊要求就保持默認(rèn)即可。如圖所示。單擊Finish按鈕完成模擬器的創(chuàng)建,可以看到模擬器列表中有了一個(gè)模擬器設(shè)備,如圖所示。
開始第一個(gè)安卓應(yīng)用啟動(dòng)Android模擬器點(diǎn)擊右側(cè)的綠色三角形啟動(dòng)按鈕,開始啟動(dòng)模擬器。模擬器就像真實(shí)的手機(jī)一樣,有一個(gè)開機(jī)過程,開機(jī)之后的界面如圖所示。接下來就用它運(yùn)行第一個(gè)Android項(xiàng)目HelloWorld。開始第一個(gè)安卓應(yīng)用
運(yùn)行第一個(gè)Android應(yīng)用運(yùn)行Android的模擬器已經(jīng)創(chuàng)建完成,現(xiàn)在就開始在模擬器上運(yùn)行HelloWorld應(yīng)用。觀察AndroidStudio頂部的工具欄圖標(biāo),與啟動(dòng)模擬器時(shí)一樣有一個(gè)綠色三角形運(yùn)行按鈕,單擊運(yùn)行按鈕,會(huì)彈出一個(gè)選擇運(yùn)行設(shè)備的對(duì)話框,如圖所示。開始第一個(gè)安卓應(yīng)用
運(yùn)行第一個(gè)Android應(yīng)用可以看到模擬器設(shè)備里有剛剛創(chuàng)建的NexusS5設(shè)備,選中單擊OK按鈕,等待模擬器響應(yīng)完畢,HelloWorld就會(huì)運(yùn)行到模擬器上,結(jié)果如圖所示。HelloWorld項(xiàng)目已經(jīng)成功運(yùn)行出來。下面來仔細(xì)分析一下這個(gè)項(xiàng)目。開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析回到AndroidStudio當(dāng)中,展開HelloWorld項(xiàng)目,如圖所示,這個(gè)項(xiàng)目結(jié)構(gòu)已經(jīng)轉(zhuǎn)換到了Project完整結(jié)構(gòu)中,AndroidStudio的默認(rèn)結(jié)構(gòu)是Android結(jié)構(gòu)。Android結(jié)構(gòu)是AndroidStudio自動(dòng)簡化之后的結(jié)構(gòu),對(duì)于初次使用該IDE的同學(xué)來說比較難理解?,F(xiàn)在來觀察Project下的項(xiàng)目結(jié)構(gòu):
開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析1..gradle和.idea這兩個(gè)目錄無須關(guān)心,這是AndroidStudio自動(dòng)生成的文件,開發(fā)者不要去手動(dòng)更改這些文件。2.app項(xiàng)目中的代碼和資源等內(nèi)容幾乎都是放在這個(gè)目錄下,在實(shí)際編寫代碼時(shí)也都是在這個(gè)目錄下進(jìn)行,隨后將會(huì)單獨(dú)對(duì)這個(gè)目錄進(jìn)行詳細(xì)講解。3.build此目錄也不必去關(guān)心,里面主要放置一些編譯時(shí)生成的文件,開發(fā)者也不要手動(dòng)去更改該目錄下的文件。開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析4.gradle這個(gè)目錄下包含了gradlewrapper的配置文件,使用gradlewrapper的方式不需要提前將gradle下載好,而是會(huì)自動(dòng)根據(jù)本地的緩存情況決定是否需要聯(lián)網(wǎng)下載gradle。AndroidStudio默認(rèn)沒有啟用gradlewrapper的方式,若需要打開,可以按照AndroidStudio導(dǎo)航欄→File→Settings命令打開,如圖所示。開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析5..gitignore此文件是用來將指定的目錄或文件排除在版本控制之外,關(guān)于版本控制會(huì)在之后的目錄中介紹。6.build.gradle這是項(xiàng)目全局的gradle構(gòu)建腳本,一般此文件中的內(nèi)容是不需要修改的。稍后詳細(xì)分析gradle腳本中的內(nèi)容。7.perties這個(gè)文件是全局的gradle配置文件,在這里配置的屬性將會(huì)影響到全局的項(xiàng)目中所有的gradle編譯腳本。
開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析8.gradlew和gradlew.bat這兩個(gè)文件是用來在命令行界面中執(zhí)行g(shù)radle命令的,其中g(shù)radlew是在Linux或Mac系統(tǒng)中使用的,gradlew.bat是在Windows系統(tǒng)中使用的。9.HelloWorld.imliml文件是所有IntelliJIDEA項(xiàng)目中都會(huì)自動(dòng)生成的一個(gè)文件(AndroidStudio是基于IntelliJIDEA開發(fā)的),開發(fā)者也不用修改這個(gè)文件中的任何內(nèi)容。10.perties這個(gè)文件用于指定本機(jī)中的AndroidSDK路徑,通常內(nèi)容都是自動(dòng)生成的,并不需要修改。除非用戶計(jì)算機(jī)上SDK位置發(fā)生變化,那么將這個(gè)文件中的路徑改成新的路徑即可。
開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析11.settings.gradle這個(gè)文件用于指定項(xiàng)目中所有引入的模塊。由于HelloWorld項(xiàng)目中只有一個(gè)app模塊,因此該文件中也引入了app這一個(gè)模塊。通常情況下模塊的引入都是自動(dòng)完成的,需要手動(dòng)修改這個(gè)文件的場景較少,但是要知道這個(gè)文件的作用,避免以后開發(fā)中遇到此種情況。至此,整個(gè)項(xiàng)目的外層目錄已經(jīng)介紹完畢。除了app目錄之外,絕大多數(shù)的文件和目錄都是自動(dòng)生成的,開發(fā)者并不需要修改。而app目錄才是之后開發(fā)的重點(diǎn)目錄,將它展開如圖所示。開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析下面對(duì)app目錄進(jìn)行詳細(xì)分析。1.build這個(gè)目錄和外層的build目錄類似,都是包含一些編譯時(shí)自動(dòng)生成的文件,不過它里面的內(nèi)容更復(fù)雜一些,這里不需要關(guān)心它。2.libs如果項(xiàng)目中使用了第三方Jar包,就需要把第三方Jar包放在libs目錄下,放在這個(gè)目錄下的Jar都會(huì)被自動(dòng)添加到構(gòu)建路徑中去。3.androidTest此處用來編寫AndroidTest測試用例,可以對(duì)項(xiàng)目進(jìn)行一些自動(dòng)化測試。開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析4.java毫無疑問,java目錄是用來放置java代碼的地方,展開該目錄,可以看到之前創(chuàng)建的HelloWorldActivity文件。5.res這個(gè)目錄下的內(nèi)容有點(diǎn)多。簡單點(diǎn)說,開發(fā)中使用到的所有圖片、布局、字符串等都要放在這個(gè)目錄下。從上圖可以看出,此目錄下還有很多目錄,圖片放在mipmap目錄下,布局放在layout目錄下,字符串放在values目錄下,所以整個(gè)res目錄雖然子目錄很多,但是各有分工,不會(huì)被弄的亂七八糟。開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析6.AndroidManifest.xml這是整個(gè)Android項(xiàng)目的配置文件,項(xiàng)目中使用到的四大組件都需要在這目錄下進(jìn)行注冊(cè),另外還可以在這個(gè)文件中給項(xiàng)目應(yīng)用添加權(quán)限聲明。這個(gè)文件會(huì)經(jīng)常用到,稍后的內(nèi)容中會(huì)詳細(xì)講解。7.test此處是用來編寫UnitTest測試用例的,是對(duì)項(xiàng)目進(jìn)行自動(dòng)化測試的另一種方式。8..gitignore與外層的.gitignore文件作用相似,是將app模塊中的指定文件或目錄排除在版本控制之外。開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析9.app.imlIntelliJIDEA項(xiàng)目自動(dòng)生成的文件,開發(fā)者不需要修改此文件內(nèi)容。10.這個(gè)文件用于指定項(xiàng)目代碼的混淆規(guī)則,當(dāng)代碼開發(fā)完成后打成安裝包文件,如果不希望代碼被別人破解,通常會(huì)將代碼進(jìn)行混淆,從而讓破解者難以閱讀。到這里基本上整個(gè)項(xiàng)目的目錄結(jié)構(gòu)就介紹完了,大家肯定有很多地方一知半解,畢竟這些都是理論知識(shí),沒有經(jīng)過一段時(shí)間的動(dòng)手開發(fā)是比較難理解。不過不用擔(dān)心,這并不會(huì)影響后面的閱讀。開發(fā)Android應(yīng)用程序開發(fā)Android應(yīng)用的步驟為:啟動(dòng)環(huán)境,創(chuàng)建項(xiàng)目;編寫程序;編譯并運(yùn)行;調(diào)試、分析和測試;發(fā)布。項(xiàng)目結(jié)構(gòu)存放程序的代碼和資源等文件程序的gradle構(gòu)建腳本指定項(xiàng)目中所使用的SDK路徑配置在Android中使用的子項(xiàng)目(Moudle)資源管理圖片資源:擴(kuò)展名為.png、.jpg、.gif、.9.png等的文件。圖片資源分類應(yīng)用圖標(biāo)資源:存放在mipmap文件夾中界面中使用的圖片資源:存放在drawable文件夾中屏幕密度匹配規(guī)則密度范圍值mipmap文件夾drawable文件夾120~160dpimipmap_mdpimipmap_mdpi160~240dpimipmap_hdpidrawable_hdpi240~320dpimipmap_xdpidrawable_xdpi320~480dpimipmap_xxdpidrawable_xxdpi480~640dpimipmap_xxxdpidrawable_xxxdpi主題是包含一種或多種的格式化屬性集合,在程序中調(diào)用主題資源可改變窗體的樣式,對(duì)整個(gè)應(yīng)用或某個(gè)Activity存在全局性影響。定義位置:res/values目錄下的styles.xml文件中標(biāo)簽 <style></style>:定義主題 <item></item>:設(shè)置主題的樣式在Android中,顏色值是由RGB(紅、綠、藍(lán))三原色和一個(gè)透明度(Alpha)表示,顏色值必須以“#”開頭,“#”后面顯示Alpha-Red-Green-Blue形式的內(nèi)容。其中,Alpha值可以省略,如果省略,表示顏色默認(rèn)是完全不透明的。尺寸資源:例如:View的寬高值定義位置:res/values/文件夾的dimens.xml文件中創(chuàng)建dimens.xml文件:右鍵單擊values文件夾,選中【New】
【XML】
【ValuesXMLFile】,在彈出框中輸入dimens。編寫尺寸資源尺寸單位px(pixels,像素):每個(gè)px對(duì)應(yīng)屏幕上的一個(gè)點(diǎn)。dp(Density-independentPixels,設(shè)備獨(dú)立像素):是一種與屏幕密度無關(guān)的尺寸單位。sp(scaledpixels,比例像素):主要處理字體的大小,可以根據(jù)用戶字體大小首選項(xiàng)進(jìn)行縮放。in(inches,英寸):標(biāo)準(zhǔn)長度單位。pt(points,磅):屏幕物理長度單位,1磅為1/72英寸。mm(Millimeters,毫米):屏幕物理長度單位。單元測試單元測試是指在應(yīng)用程序開發(fā)過程中對(duì)最小的功能模塊進(jìn)行測試,可以在完成某個(gè)功能之后對(duì)該功能進(jìn)行單獨(dú)測試。單元測試分類:Android單元測試:連接Android設(shè)備、速度比較慢、適合需要調(diào)用AndroidAPI的單元測試。Junit單元測試:不依賴Android設(shè)備(在本地即可運(yùn)行)、速度快、適合只對(duì)java代碼功能進(jìn)行的單元測試。logcatLogCat是Android中的命令行工具,用于獲取程序從啟動(dòng)到關(guān)閉的日志信息。Log類所輸出的日志內(nèi)容分為六個(gè)級(jí)別。級(jí)別Log類中的靜態(tài)方法VerboseLog.v()DebugLog.d()InfoLog.i()WarningLog.w()ErrorLog.e()AssertLog.wtf()Log.v("MainActivity","Verbose");Log.d("MainActivity","Degug");Log.i("MainActivity","Info");Log.w("MainActivity","Warning");Log.e("MainActivity","Error");Log.wtf("MainActivity","Assert");除了設(shè)置過濾器過濾所需的信息外,還可以輸入TAG信息、根據(jù)Log級(jí)別等方式過濾信息。LogCat區(qū)域中日志信息根據(jù)級(jí)別不同顯示不同的顏色級(jí)別顯示信息日志信息顏色verbose(V)全部信息黑色debug(D)調(diào)試信息藍(lán)色info(I)一般信息綠色warning(W)警告信息橙色error(E)錯(cuò)誤信息紅色assert斷言失敗后的錯(cuò)誤消息紅色開始第一個(gè)安卓應(yīng)用Android應(yīng)用結(jié)構(gòu)分析現(xiàn)在已經(jīng)將HelloWorld項(xiàng)目的目錄結(jié)構(gòu)以及基本的執(zhí)行過程都分析完畢,下面來講解前面遺留的兩個(gè)小問題,一個(gè)是Project目錄下的build.gradle文件,一個(gè)是Manifest.xml文件。首先看Project目錄下的build.gradle文件。不同于Eclipse,AndroidStudio是采用Gradle來構(gòu)建項(xiàng)目的。它使用了一種基于Groovy的領(lǐng)域特定語言(DomainSpecificLanguageDSL)來聲明項(xiàng)目設(shè)置,摒棄了傳統(tǒng)基于XML(如Ant和Maven)的各種繁瑣配置。在上圖展開的app目錄圖中,可以看到兩個(gè)build.gradle文件,一個(gè)是Project下的外層文件,一個(gè)在app目錄下。這兩個(gè)文件對(duì)構(gòu)建Android項(xiàng)目起到了至關(guān)重要的作用,下面來對(duì)這兩個(gè)文件進(jìn)行詳細(xì)分析。Android應(yīng)用的基本組件介紹Android應(yīng)用程序通常由一個(gè)或多個(gè)基本組件組成,之前創(chuàng)建HelloWorld項(xiàng)目時(shí)就用到了Activity組件。其實(shí)Android基本組件還包括Service、BroadcastReceiver、ContentProvider等組件,這四大組件也是日后做安卓開發(fā)時(shí)經(jīng)常用到的。本節(jié)大家先對(duì)這些組件有一個(gè)大致的認(rèn)識(shí),后面的內(nèi)容中會(huì)對(duì)這些組件做詳細(xì)介紹。Android應(yīng)用的基本組件介紹Activity和ViewActivity是Android應(yīng)用中負(fù)責(zé)與用戶交互的組件,凡是在應(yīng)用中看到的界面,都是在Activity中顯示。前面提過,Activity通過setContentView(View)方法顯示指定的組件。View組件是所有UI組件和容器控件的基類,它是App中用戶能看到的部分。View組件是放在容器組件中,或是使用Activity將其顯示出來。如果需要通過某個(gè)Activity把指定View顯示出來,調(diào)用Activity的setContentView()方法即可。若一個(gè)Activity中沒有調(diào)用setContentView()方法來顯示指定的View,那么該頁面將會(huì)顯示一個(gè)空窗口。Activity還包含了一個(gè)setTheme(intresid)方法,它用來設(shè)置對(duì)應(yīng)的Activity的主題風(fēng)格。比如不希望該Activity顯示ActionBar、或以dialog形式顯示等,都可以通過該方法來設(shè)置。Android應(yīng)用的基本組件介紹ServiceService與Activity相比,可以把Service看作是沒有View的Activity,事實(shí)上Service也沒有可以設(shè)置顯示View的方法。因?yàn)椴挥蔑@示View,也就不需要與用戶交互,故它一般在后臺(tái)運(yùn)行,用戶是看不到它的。Android應(yīng)用的基本組件介紹BroadcastReceiverBroadcastReceiver翻譯過來就是廣播接收器,事實(shí)上它在Android中作用也是廣播。從代碼實(shí)現(xiàn)的角度來看,BroadcastReceiver非常類似于事件編程中的監(jiān)聽器,但兩者的區(qū)別在于,普通事件監(jiān)聽器監(jiān)聽的事件源是程序中的對(duì)象,而廣播接收器監(jiān)聽的事件源是Android應(yīng)用中的其他組件。實(shí)現(xiàn)BroadcastReceiver的方式很簡單,開發(fā)者只要編寫繼承BroadcastReceiver的類,并重寫onReceiver()方法就可以了。但是這只是接收器,那接收的消息從哪里來呢?當(dāng)其他組件通過sendBroadcast()、sendStickyBroadcast()或sendOrderedBroadcast()方法發(fā)送廣播消息時(shí),如果接收廣播的組件中實(shí)現(xiàn)的BroadcastReceiver子類有對(duì)應(yīng)的Action(通過IntentFilter的setAction設(shè)置),那么就可以在onReceiver()方法中接收該消息。Android應(yīng)用的基本組件介紹BroadcastReceiver實(shí)現(xiàn)BroadcastReceiver子類之后,需要在AndroidManifest.xml中注冊(cè)才能使用該廣播。那么BroadcastReceiver如何注冊(cè)呢?有兩種注冊(cè)方式:(1)在Java代碼中通過Context.registerReceiver()方法注冊(cè);(2)在AndroidManifest.xml中通過<receiver…/>元素完成注冊(cè)。這里只是讓大家對(duì)BroadcastReceiver有一個(gè)大致的了解,在后面的章節(jié)中會(huì)詳細(xì)介紹。Android應(yīng)用的基本組件介紹ContentProvider在Android平臺(tái)中,ContentProvider是一種跨進(jìn)程間通信。比如當(dāng)發(fā)送短信時(shí),需要在聯(lián)系人應(yīng)用中讀取指定聯(lián)系人的數(shù)據(jù),這時(shí)就需要兩個(gè)應(yīng)用程序之間進(jìn)行數(shù)據(jù)交換。而ContentProvider提供了這種數(shù)據(jù)交換的標(biāo)準(zhǔn)。當(dāng)開發(fā)者實(shí)現(xiàn)ContentProvider時(shí),需要實(shí)現(xiàn)如下抽象方法:(1)insert(Uri,,ContentValues):向ContentProvider插入數(shù)據(jù);(2)delete(Uri,ContentValues):刪除ContentProvider中指定的數(shù)據(jù);(3)update(Uri,ContentValues,String,String[]):更新ContentProvider指定的數(shù)據(jù);(4)query(Uri,String[],String,String[],String):查詢數(shù)據(jù)。Android應(yīng)用的基本組件介紹ContentProvider通常與ContentProvider結(jié)合使用的是ContentResolver,一個(gè)應(yīng)用程序使用ContentProvider暴露自己的數(shù)據(jù),而另一個(gè)應(yīng)用程序則通過ContentResolver來訪問程序。Android應(yīng)用的基本組件介紹Intent和IntentFilter這兩個(gè)并不是Android應(yīng)用的組件,但它對(duì)Android應(yīng)用的作用非常大——它是Android應(yīng)用內(nèi)不同組件之間通信的載體。當(dāng)一個(gè)Android應(yīng)用內(nèi)需要有不同組件之間的跳轉(zhuǎn),例如一個(gè)Activity跳轉(zhuǎn)到另一個(gè)Activity,或者Activity跳轉(zhuǎn)到Service時(shí),甚至發(fā)送和接收廣播時(shí),都需要用到Intent。Intent封裝了大量關(guān)于目標(biāo)組件的信息,可以利用它啟動(dòng)Activity、Service或者BroadcastReceiver。一般稱Intent為“意圖”,意圖可以分為兩類:(1)顯式Intent:明確指定需要啟動(dòng)或者觸發(fā)的組件的類名。(2)隱式Intent:指定需要啟動(dòng)或者觸發(fā)的組件應(yīng)滿足怎樣的條件。Android應(yīng)用的基本組件介紹Intent和IntentFilter對(duì)于顯式Intent,Android系統(tǒng)無須對(duì)該Intent做出任何解析,系統(tǒng)直接找到指定的目標(biāo)組件,啟動(dòng)或者觸發(fā)它即可。而對(duì)于隱式Intent,Android需要解析出它的條件,然后再在系統(tǒng)中查找與之匹配的目標(biāo)組件。若找到符合條件的組件,就啟動(dòng)或觸發(fā)它們。程序的日志程序日志是記錄程序中硬件、軟件、系統(tǒng)問題的反饋信息,同時(shí)還可以監(jiān)視程序中發(fā)生的執(zhí)行狀態(tài)和變化。用戶可以通過它來檢查錯(cuò)誤發(fā)生的原因和痕跡。日志類型包括系統(tǒng)日志、應(yīng)用程序日志和安全日志。日志通常有五種輸出類型級(jí)別,詳細(xì)描述如下:1)DEBUG級(jí)別:調(diào)試信息提示。2)INFO級(jí)別:比較重要的信息提示。3)WARN級(jí)別:可能存在的潛在問題的提示。4)ERROR級(jí)別:系統(tǒng)發(fā)生異常的提示。5)FATAL級(jí)別:系統(tǒng)發(fā)生了致命的錯(cuò)誤的提示。程序調(diào)試程序調(diào)試,是程序投入實(shí)際運(yùn)行前,手動(dòng)或使用編譯程序等方法進(jìn)行測試,修正語法錯(cuò)誤和邏輯錯(cuò)誤的過程。調(diào)試可以不斷地對(duì)程序進(jìn)行調(diào)整優(yōu)化以達(dá)到最好的效果。在開發(fā)中,通常在未達(dá)到預(yù)期結(jié)果、即將拋出運(yùn)行時(shí)異常和程序性能不佳時(shí)使用。使用的步驟大致分為3步1.設(shè)置調(diào)試斷點(diǎn)2.開啟調(diào)試會(huì)話3.單步調(diào)試本章小結(jié)本章主要介紹Android的歷史和發(fā)展,安裝JDK、AndroidStudio和SDK來搭建Android開發(fā)環(huán)境,使用AndroidStudio開發(fā)第一個(gè)安卓應(yīng)用,并通過第一個(gè)安卓應(yīng)用掌握Android應(yīng)用程序的基本結(jié)構(gòu)以及相關(guān)程序文件的作用。開發(fā)過程中能夠使用AndroidStudio提供的工具調(diào)試程序,開發(fā)完成后能夠打包發(fā)布應(yīng)用.作業(yè)Android控件與界面交互內(nèi)容結(jié)構(gòu)主要內(nèi)容1)了解Android中的視圖。2)掌握常用的UI控件。3)掌握消息框和對(duì)話框的使用。4)理解Android的事件處理界面布局概述Android界面布局就是定義應(yīng)用中的界面結(jié)構(gòu)(例如Activity的界面結(jié)構(gòu))。界面布局中的所有元素均使用View和ViewGroup對(duì)象的層次結(jié)構(gòu)進(jìn)行構(gòu)建。View通常繪制用戶可查看并進(jìn)行交互的內(nèi)容。然而,ViewGroup是不可見容器,用于定義View和其他ViewGroup對(duì)象的布局結(jié)構(gòu)。界面布局編寫方式在XML文件中編寫布局:推薦此種方式布局有效的將界面中布局的代碼和Java代碼隔離,使程序的結(jié)構(gòu)更加清晰。在Java代碼中編寫布局在Android中所有布局和控件的對(duì)象都可以通過new關(guān)鍵字創(chuàng)建出來,將創(chuàng)建的View控件添加到ViewGroup布局中,從而實(shí)現(xiàn)View控件在布局界面中顯示。界面布局編寫方式界面編程和視圖視圖組件和容器組件Android應(yīng)用的絕大多數(shù)UI組件都是放在Android.widget包及其子包、Android.view包及其子包中。值得注意的是,Android中所有的組件都是繼承了View類,View組件代表一個(gè)空白的矩形區(qū)域。View類還有一個(gè)重要的子類ViewGroup,但ViewGoup類經(jīng)常作為其他組件的容器使用。Android的所有UI組件都建立在View、ViewGroup基礎(chǔ)之上,它們的組織結(jié)構(gòu)如圖所示。Android應(yīng)用的界面都是由View和ViewGroup對(duì)象構(gòu)建的,ViewGroup繼承了View類,也可以當(dāng)成普通的View來使用,但主要還是當(dāng)成容器來使用。Android應(yīng)用的絕大部分UI組件都放在android.widget包和android.view包中。View對(duì)象通常稱為“UI控件”,例如Button、TextView都屬于View的子類。ViewGroup對(duì)象通常稱為“布局”,用于定義界面的布局結(jié)構(gòu),例如LinearLayout、ConstraintLayout都屬于ViewGroup。界面編程和視圖視圖組件和容器組件Android講究邏輯層和視圖層分離,開發(fā)中一般不在Activity中直接編寫界面,而是在布局文件中編寫。Android中所有組件都提供了兩種方式來控制組件的運(yùn)行:在XML布局文件(即前面說的layout文件)中通過XML屬性進(jìn)行控制。在Java代碼(一般是指Activity)中通過調(diào)用方法進(jìn)行控制。不管使用哪種方式,其本質(zhì)和顯示出來的效果是一樣的。對(duì)于View類而言,由于它是所有UI組件的基類,所以它包含的XML屬性和方法是所有UI組件都可以使用的。而ViewGroup類雖然繼承了View類,但由于它是抽象類,因此實(shí)際使用中通常只是用ViewGroup的子類作為容器。下面來詳細(xì)講解兩種控制UI組件的方式。界面編程和視圖使用XML布局文件控制UI界面Android推薦使用這種方式來控制視圖,因?yàn)檫@樣不僅簡單直接,而且將視圖控制邏輯從Java代碼中分離出來,單獨(dú)在XML文件中控制,更好地體現(xiàn)了MVC原則。在第1章介紹項(xiàng)目的結(jié)構(gòu)目錄時(shí),布局文件是放在app\src\main\res\layout文件夾下面,然后通過Java代碼中setContentView()方法在Activity中顯示該視圖的。在實(shí)際開發(fā)中,當(dāng)遇到有很多UI組件時(shí)(實(shí)際上這種情況很常見),各個(gè)組件會(huì)通過android:id屬性給每個(gè)組件設(shè)置一個(gè)唯一的標(biāo)識(shí)。當(dāng)需要在代碼中訪問指定的組件時(shí)(例如設(shè)置單擊事件),就可以通過id值,利用方法findViewById(R.id.id值)來訪問。界面編程和視圖使用XML布局文件控制UI界面在設(shè)置UI組件時(shí)有兩個(gè)屬性值最常用:android:layout_height、android:layout_width,這兩個(gè)屬性支持兩種屬性值:(1)match_parent:指定子組件的高度和寬度與父組件的高度和寬度相同(實(shí)際還有填充的空白距離)。(2)wrap_content:指定組件的大小恰好能包裹它的內(nèi)容。Android機(jī)制決定了UI組件的大小不僅受它實(shí)際寬度和高度的控制,還受它所在布局的高度和寬度控制,所以在設(shè)置組件的寬高時(shí)還要考慮布局的寬高。其實(shí)在XML文件中編寫界面還有很多的屬性,比如gravity、LinearLayout中的orientation、RelativeLayout中的centerInParent屬性等等,這些屬性在之后的內(nèi)容中都會(huì)講到。布局聲明Android講究邏輯層和視圖層分離,開發(fā)中一般不在Activity中直接編寫界面,而是在布局文件中編寫。Android程序中可通過兩種方式聲明布局:1.用XML文件聲明布局在2.Java代碼實(shí)例化布局元素布局的類型一個(gè)優(yōu)秀的布局設(shè)計(jì)對(duì)UI界面起到重要的作用,在Android中常用布局主要有7種,經(jīng)常使用的有5中布局分別是:1)線性布局(LinearLayout),以水平或垂直方向排列。2)相對(duì)布局(RelativeLayout),通過相對(duì)定位排列。3)表格布局(TableLayout),表格形式排列。4.)幀布局(FrameLayout),開辟空白區(qū)域,幀里的控件(層)疊加。5)約束布局(ConstraintLayout),可視化的方式編寫布局。界面中的尺寸1)dp。密度無關(guān)像素,2)sp??s放無關(guān)像素,它和dp單位類似,但它也會(huì)根據(jù)用戶的字體大小偏好設(shè)置進(jìn)行縮放。建議您在指定字體大小時(shí)使用此單位,以便字體大小會(huì)根據(jù)屏幕密度和用戶偏好設(shè)置進(jìn)行調(diào)整。3)pt。點(diǎn),1/72英寸,基于屏幕的物理尺寸,假設(shè)屏幕密度為72dpi。4)px。像素,它對(duì)應(yīng)于屏幕上的實(shí)際像素?cái)?shù)。建議不要使用這種度量單位,因?yàn)椴煌O(shè)備的實(shí)際呈現(xiàn)效果可能不同;每臺(tái)設(shè)備的每英寸像素?cái)?shù)可能不同,屏幕上的總像素?cái)?shù)也可能有差異。5)mm。毫米,基于屏幕的物理尺寸。
6)in。英寸,基于屏幕的物理尺寸。幾組重要的UI組件TextView及其子類TextView直接繼承了View,并且它還是EditText和Button兩個(gè)UI組件的父類,TextView類圖如圖所示。TextView的作用就是在界面上顯示文本,只是Android關(guān)閉了它的文字編輯功能(EditText有編輯功能)。常見的UI控件TextView及其子類TextView及其子類TextView派生了5個(gè)類,除了常用的EditText和Button類之外,還有CheckedTextView,CheckedTextView增加了checked狀態(tài),開發(fā)者可以通過setChecked(boolean)和isChecked()方法來改變和訪問checked狀態(tài)。TextView和EditText有很多相似的地方,它們之間最大的區(qū)別就是TextView不允許用戶編輯文本內(nèi)容,而EditText則可以。TextView提供了大量XML屬性,這些屬性不僅適用于TextView本身,也同樣適用于它的子類(EditText、Button等)。TextView及其子類下表列出了TextView的幾個(gè)常用屬性。當(dāng)然TextView的屬性并不止這些,還有很多屬性并沒有寫出來,在實(shí)際開發(fā)中,可以通過API文檔來查找需要的屬性。TextView及其子類1.EditText的功能和用法EditText組件最重要的屬性是inputType,該屬性能接收的屬性值非常豐富,而且隨著Android版本的升級(jí),該屬性能接收的類型還會(huì)增加。EditText還派生了如下兩個(gè)子類:AutoCompleteTextView:帶有自動(dòng)完成功能的EditText。ExtractEditText:它并不是UI組件,而是EditText組件的底層服務(wù)類,負(fù)責(zé)提供全屏輸入法的支持。TextView及其子類
2.Button的功能和用法Button主要是在界面上生成一個(gè)可供用戶單擊的按鈕,當(dāng)用戶單擊之后觸發(fā)其onClick事件。Button使用起來比較簡單,通過android:background屬性可以改變按鈕的背景顏色或背景圖片,如果想要這兩項(xiàng)內(nèi)容隨著用戶動(dòng)作動(dòng)態(tài)改變,就需要用到自定義的Drawable對(duì)象來實(shí)現(xiàn)。關(guān)于TextView的其他子類限于篇幅就不做介紹了,有興趣的同學(xué)可以自己嘗試編寫代碼練習(xí)。RadioButton和CheckBoxImageView及其子類ImageView很容易讓大家覺得這是一個(gè)顯示圖片的View,這種說法沒錯(cuò),但是不全面,因?yàn)樗茱@示Drawable中的所有對(duì)象。如圖所示,ImageView派生了ImageButton、QuickContactBadge等組件。ImageView及其子類ImageView及其子類ImageView所支持的常用XML屬性,如表所示。ImageView及其子類由于android:scaleType屬性經(jīng)常使用到,下面詳細(xì)介紹它支持的屬性值,如表所示。ImageView及其子類ImageView派生了兩個(gè)子類:ImageButton:圖片按鈕QuickContactBadge:顯示關(guān)聯(lián)到特定聯(lián)系人的圖片Button與ImageButton的區(qū)別在于,Button按鈕顯示文字而ImageButton顯示圖片(因?yàn)镮mageButton本質(zhì)還是ImageView)。ImageButton派生了一個(gè)ZoomButton類,它代表兩個(gè)按鈕“放大”“縮小”,Android默認(rèn)為ZoomButton提供了"btn_minus"、"btn_plus"兩個(gè)屬性值,只要設(shè)置它們到ZoomButton的android:src屬性中就可實(shí)現(xiàn)放大、縮小功能。ImageView及其子類QuickContactBadge的本質(zhì)也是圖片按鈕,也可以通過android:src屬性設(shè)置圖片。但是它可以關(guān)聯(lián)到手機(jī)中指定的聯(lián)系人,當(dāng)用戶單擊該圖片時(shí),系統(tǒng)會(huì)自動(dòng)打開相應(yīng)聯(lián)系人的聯(lián)系方式界面。
【示例2.3】制作簡易的問卷界面。使用單選按鈕和復(fù)選框?qū)崿F(xiàn)簡易的調(diào)查問卷,運(yùn)行效果如圖2-7所示。ProgressBar及其子類Android事件處理事件處理概述事件與用戶界面緊密相關(guān),當(dāng)用戶在應(yīng)用程序界面執(zhí)行一系列操作時(shí),程序要響應(yīng)用戶的各種事件,如單擊、長按、觸碰、鍵盤輸入等,響應(yīng)這些動(dòng)作就需要事件來完成。(1)基于監(jiān)聽的事件處理它是基于面向?qū)ο蟮氖录幚頇C(jī)制,這種方式與Swing的處理方式完全相同。由三類對(duì)象組成:1)事件源:產(chǎn)生事件的來源,通常是各個(gè)組件,如按鈕、窗口、菜單等。2)事件:事件封裝了界面組件上發(fā)生的特定事件的具體信息(如單擊、長按、觸摸等),如果監(jiān)聽器需要獲取界面組件上所發(fā)生事件的相關(guān)信息,一般通過事件Event對(duì)象來傳遞。3)事件監(jiān)聽器:負(fù)責(zé)監(jiān)聽事件源發(fā)生的事件,并對(duì)不同的事件做相應(yīng)的處理,如單擊、長按、觸碰等。基于監(jiān)聽的事件處理是一種委派式Delegation的事件處理方式,事件源將整個(gè)事件委托給事件監(jiān)聽器,由監(jiān)聽器對(duì)事件進(jìn)行響應(yīng)處理。這種處理方式將事件源和事件監(jiān)聽器分離,有利于提供程序的可維護(hù)性(2)基于回調(diào)的事件處理它的事件源和事件監(jiān)聽器是合一的,沒有獨(dú)立的事件監(jiān)聽器存在。當(dāng)用戶在GUI組件上觸發(fā)某事件時(shí),由該組件自身特定的函數(shù)負(fù)責(zé)處理該事件基本模型事件監(jiān)聽的處理模型說明在事件監(jiān)聽的處理模型中,主要涉及三類對(duì)象:1)EventSource(事件源):一般指各個(gè)組件。2)Event(事件):一般是指用戶操作,該事件封裝了界面組件上發(fā)生的各種特定事件。3)EventListener(事件監(jiān)聽器):負(fù)責(zé)監(jiān)聽事件源所發(fā)生的事件,并對(duì)該事件做出響應(yīng)。在事件監(jiān)聽的處理模型中,主要涉及三類對(duì)象:EventSource(事件源):一般指各個(gè)組件。Event(事件):一般是指用戶操作,該事件封裝了界面組件上發(fā)生的各種特定事件。EventListener(事件監(jiān)聽器):負(fù)責(zé)監(jiān)聽事件源所發(fā)生的事件,并對(duì)該事件做出響應(yīng)。實(shí)際上,事件響應(yīng)的動(dòng)作就是一組程序語句,通常以方法的形式組織起來。Android利用的是Java語言開發(fā),其面向?qū)ο蟮谋举|(zhì)沒有改變,所以方法必須依附于類中才可以使用。而事件監(jiān)聽器的核心就是它所包含的方法,這些方法也被稱為事件處理器(EventHandler)。事件監(jiān)聽的處理模型可以這樣描述:當(dāng)用戶在程序界面操作時(shí),會(huì)激發(fā)一個(gè)相應(yīng)的事件,該事件就會(huì)觸犯事件源上注冊(cè)事件監(jiān)聽器,事件監(jiān)聽器再調(diào)用對(duì)應(yīng)的事件處理器做出相應(yīng)的反應(yīng)。Android的事件處理機(jī)制采用了一種委派式的事件處理方式:普通組件(事件源)將整個(gè)事件處理委派給特定的對(duì)象(事件監(jiān)聽器),當(dāng)該組件發(fā)生指定的事件時(shí),就通知所委托的事件監(jiān)聽器,由該事件監(jiān)聽器處理該事件。該流程如圖所示。事件監(jiān)聽的處理模型這種委派式的處理方式很類似于人類社會(huì)的分工合作。舉一個(gè)簡單例子,當(dāng)人們想郵寄一份快遞(事件源)時(shí),通常是將該快遞交給快遞點(diǎn)(事件監(jiān)聽器)來處理,再由快遞點(diǎn)通知物流公司(事件處理器)運(yùn)送快遞,而快遞點(diǎn)也會(huì)監(jiān)聽多個(gè)物流公司的快遞,進(jìn)而通知不同的物流公司。這種處理方式將事件源與事件監(jiān)聽器分離,從而提供更好的程序模型,有利于提高程序的可維護(hù)性?;谏厦娉绦蚩梢钥偨Y(jié)出基于監(jiān)聽的事件處理模型的編程步驟:(1)獲取要被監(jiān)聽的組件(事件源)。(2)實(shí)現(xiàn)事件監(jiān)聽器類,該類是一個(gè)特殊的Java類,必須實(shí)現(xiàn)一個(gè)XxxListener接口。(3)調(diào)用事件源的setXxxListener方法將事件監(jiān)聽器對(duì)象注冊(cè)給事件源。事件監(jiān)聽的處理模型當(dāng)用戶操作應(yīng)用界面,觸發(fā)事件源上指定的事件時(shí),Android會(huì)觸發(fā)事件監(jiān)聽器,然后由該事件監(jiān)聽器調(diào)用指定的方法(事件處理器)來處理事件。實(shí)際上,對(duì)于上述三個(gè)步驟,最關(guān)鍵的步驟是實(shí)現(xiàn)事件監(jiān)聽器類。實(shí)現(xiàn)事件監(jiān)聽器其實(shí)就是實(shí)現(xiàn)了特定接口的Java類實(shí)例,在程序中實(shí)現(xiàn)事件監(jiān)聽器,通常有如下幾種形式。內(nèi)部類形式:將事件監(jiān)聽器類定義成當(dāng)前類的內(nèi)部類。外部類形式:將事件監(jiān)聽器類定義成一個(gè)外部類。Activity本身作為事件監(jiān)聽器類:讓Activity本身實(shí)現(xiàn)監(jiān)聽器接口,并實(shí)現(xiàn)事件處理方法。匿名內(nèi)部類形式:使用匿名內(nèi)部類創(chuàng)建事件監(jiān)聽器對(duì)象。外部類形式創(chuàng)建監(jiān)聽器。創(chuàng)建監(jiān)聽器的幾種形式舉例上面的事件監(jiān)聽器類實(shí)現(xiàn)了View.OnClickListener接口,創(chuàng)建該監(jiān)聽器時(shí)需要穿入一個(gè)Activity和一個(gè)TextView,來看具體Java代碼:上面程序第10行,用于給按鈕的單擊事件綁定監(jiān)聽器,當(dāng)用戶單擊按鈕時(shí),就會(huì)觸發(fā)監(jiān)聽器BtnClickListener,從而執(zhí)行監(jiān)聽器里面的方法。創(chuàng)建監(jiān)聽器的幾種形式舉例外部類形式的監(jiān)聽器基本就是這樣實(shí)現(xiàn),專門定義一個(gè)外部類用于實(shí)現(xiàn)事件監(jiān)聽類接口作為事件監(jiān)聽器,之后在對(duì)應(yīng)的組件中注冊(cè)該監(jiān)聽器。Activity本身作為事件監(jiān)聽器類。創(chuàng)建監(jiān)聽器的幾種形式舉例上面程序中Activity直接實(shí)現(xiàn)了View.OnClickListener接口,從而可以直接在該Activity中定onClick(Viewv)。當(dāng)為某個(gè)組件添加該事件監(jiān)聽器的時(shí)候,直接使用this關(guān)鍵字作為事件監(jiān)聽器即可。匿名內(nèi)部類作為事件監(jiān)聽器??梢钥闯瞿涿麅?nèi)部類的語法結(jié)構(gòu)比較奇怪,除了這個(gè)缺點(diǎn),匿名內(nèi)部類相比于其他方式比較有優(yōu)勢,一般建議使用匿名內(nèi)部類的方式創(chuàng)建監(jiān)聽器類。簽中綁定事件處理器除了上述幾種方式之外,還有一種更簡單的綁定事件監(jiān)聽器的方式,就是直接在布局文件中為指定標(biāo)簽綁定事件處理方法。對(duì)于Android中的很多組件來說,它們都支持onClick屬性,例如在第2章中提到的Button的屬性onClick,來看具體示例代碼。在標(biāo)簽中綁定事件處理器為Button綁定了一個(gè)事件處理方法:btnClick,這也意味著開發(fā)者需要在對(duì)應(yīng)的Activity中定義一個(gè)voidbtnClick(Viewv)的方法,該方法將會(huì)處理Button上的點(diǎn)擊事件,來看Activity中的代碼。上面程序中的第11行就是屬性onClick對(duì)應(yīng)的方法,當(dāng)用戶點(diǎn)擊該按鈕時(shí),btnClick方法將會(huì)被觸發(fā)進(jìn)而處理此點(diǎn)擊事件?;诨卣{(diào)的事件處理回調(diào)機(jī)制前面提到監(jiān)聽機(jī)制是一種委派式的事件處理機(jī)制,事件源與事件監(jiān)聽器分離,用戶觸發(fā)事件源指定的事件之后,交給事件監(jiān)聽器處理相應(yīng)的事件。而回調(diào)機(jī)制則完全相反,它的事件源與事件監(jiān)聽器是統(tǒng)一的,或者可以說,它沒有事件監(jiān)聽器的概念。因?yàn)樗梢酝ㄟ^回調(diào)自身特定的方法處理相應(yīng)的事件。為了實(shí)現(xiàn)回調(diào)機(jī)制的事件處理,需要繼承GUI組件類,并重寫對(duì)應(yīng)的事件處理方法,其實(shí)就是第2章中講到的自定義UI組件的方法。Android為所有的GUI組件提供了一些事件處理的回調(diào)方法,以View類為例,該類包含如下表所示方法。就代碼實(shí)現(xiàn)的角度而言,基于回調(diào)的事件處理模型更加簡單。基于回調(diào)的事件傳播開發(fā)者可控制基于回調(diào)的事件傳播,幾乎所有基于回調(diào)的事件處理方法都有一個(gè)boolean類型的返回值,該返回值決定了對(duì)應(yīng)的處理方法能否完全處理該事件。當(dāng)返回值為false時(shí),表明該處理方法并未完全處理該事件,事件會(huì)繼續(xù)向下傳播;返回值為true時(shí),表明該處理方法已完全處理該事件,該事件不會(huì)繼續(xù)傳播。因此對(duì)基于回調(diào)的事件處理方式而言,某組件上所發(fā)生的事件不僅會(huì)激發(fā)該組件上的回調(diào)方法,也會(huì)觸發(fā)所在Activity的回調(diào)方法,只要該事件能傳播到該Activity。實(shí)現(xiàn)事件處理實(shí)際上,對(duì)于上述三個(gè)步驟,最關(guān)鍵的步驟是實(shí)現(xiàn)事件監(jiān)聽器類。實(shí)現(xiàn)事件監(jiān)聽器其實(shí)就是實(shí)現(xiàn)了特定接口的Java類實(shí)例,在程序中實(shí)現(xiàn)事件監(jiān)聽器,通常有如下幾種形式:內(nèi)部類形式:將事件監(jiān)聽器類定義成當(dāng)前類的內(nèi)部類。外部類形式:將事件監(jiān)聽器類定義成一個(gè)外部類。Activity本身作為事件監(jiān)聽器類:讓Activity本身實(shí)現(xiàn)監(jiān)聽器接口,并實(shí)現(xiàn)事件處理方法。匿名內(nèi)部類形式:使用匿名內(nèi)部類創(chuàng)建事件監(jiān)聽器對(duì)象。總結(jié)本章主要講解了Android中控件的相關(guān)知識(shí),包括簡單控件、AlertDilog對(duì)話框、消息框以及事件處理機(jī)制。通過本章的學(xué)習(xí),希望初學(xué)者能掌握Android控件的基本使用,能夠在界面布局中設(shè)置控件的屬性完成程序的界面設(shè)計(jì),理解Android的事件處理方式,來實(shí)現(xiàn)界面與用戶的交互。第三章Android界面布局學(xué)習(xí)目標(biāo)1)掌握Android中主要布局。2)掌握ListView控件的使用。3)掌握RecyclerView的使用。4)會(huì)使用消息框和對(duì)話框。5)會(huì)使用菜單組件。五種常用布局線性布局相對(duì)布局幀布局表格布局約束布局特點(diǎn):以水平或垂直方向排列特點(diǎn):通過相對(duì)定位排列特點(diǎn):開辟空白區(qū)域,幀里的控件(層)疊加特點(diǎn):表格形式排列特點(diǎn):可視化的方式編寫布局常見界面布局布局管理器什么是布局LinearLayout(線性布局)、FrameLayout(幀布局)、RelativeLayout(相對(duì)布局)、AbsoluteLayout(絕對(duì)布局)、TableLayout(表格布局)、GridLayout(網(wǎng)格布局)六大基本布局以及它們常用的屬性,并且結(jié)合不同布局的各自特點(diǎn)給出自身特有的屬性(重復(fù)的屬性不會(huì)列出)。布局管理器線性布局線性布局(LinearLayout)是一種常用的布局,這個(gè)布局會(huì)將它所包含的控件在線性方向上依次排列,通過android:orientation屬性設(shè)置控件排列方向,水平方向?yàn)閔orizontal,垂直方向?yàn)関ertical。線性布局不會(huì)自動(dòng)換行,當(dāng)組件按順序排列到屏幕邊緣時(shí),之后的組件將不會(huì)顯示。布局管理器線性布局gravity與layout_gravity的區(qū)別在于,gravity是指本身元素顯示在什么位置,layout_gravity是指顯示在父元素的什么位置。例如Button組件,gravity屬性表示Button上的字在Button上的位置,layout_gravity則表示Button在父界面上的位置。布局管理器表格布局表格布局(TableLayout)繼承于LinearLayout,所以它依然是線性布局管理器,并且LinearLayout的所有屬性都適用于TableLayout。TableLayout采用行、列的形式來管理UI組件,但并不需要聲明行數(shù)和列數(shù),而是通過添加TableRow、其他組件來控制表格的行數(shù)和列數(shù)。向TableLayout中添加TableRow就添加一個(gè)表格行,而TableLayout也是一個(gè)容器,所以也可以向TableLayout中添加組件,每添加一個(gè)組件該表格行就增加一列。如果直接向TableLayout中添加一個(gè)組件,那么這個(gè)組件就直接占用一行。布局管理器幀布局幀布局(FrameLayout)相比于前面兩種布局就簡單多了,它的應(yīng)用場景相較于其他布局少一些,但在比較復(fù)雜的自定義布局中,幀布局是很受歡迎的。因?yàn)檫@種布局沒有任何的定位方式,所有的控件都會(huì)默認(rèn)擺放在布局的左上角。FrameLayout的兩個(gè)常用屬性:android:foreground[setForeground(Drawable)]:定義幀布局容器的繪圖前景圖像。android:foregroundGravity[setForegroundGravity(int)]:定義繪圖前景圖像重力屬性。布局管理器相對(duì)布局相對(duì)布局(RelativeLayout)
也是一種非常常用的布局,與LinearLayout的排列規(guī)則不同的是,RelativeLayout顯得更加隨意一些,它總是通過相對(duì)定位的方式讓控件出現(xiàn)在布局的任何位置,例如相對(duì)容器內(nèi)兄弟組件、父容器的位置決定了它自身的位置。也正因?yàn)槿绱耍琑elativeLayout中的屬性非常多,不過這些屬性都是有規(guī)律可循的。布局管理器網(wǎng)格布局網(wǎng)格布局(GridLayout)是Android4.0之后新增的布局管理器,因此正常情況下需要在Android4.0之后的版本中才能使用,如果希望在更早的版本中使用,則需要導(dǎo)入相應(yīng)的支撐庫(v7包下的gridlayout包)。GridLayout和前面所講的TableLayout(表格布局)有點(diǎn)類似,不過它有很多前者沒有的特性,因此也更加好用:可以自己設(shè)置布局中組件的排列方式;可以自定義網(wǎng)格布局有多少行或列;可以直接設(shè)置組件位于某行某列;可以設(shè)置組件橫跨幾行或者幾列。布局管理器絕對(duì)布局絕對(duì)布局(AbsoluteLayout)是由開發(fā)人員通過X、Y坐標(biāo)來控制組件的位置的。絕大多數(shù)情況下是不會(huì)采用絕對(duì)布局編寫布局,因?yàn)檫\(yùn)行Android應(yīng)用的手機(jī)千差萬別,屏幕大小、分辨率、屏幕密度等都可能存在較大的差異,使用絕對(duì)布局很難做機(jī)型適配,因此簡單了解這種布局方式即可。使用絕對(duì)布局時(shí),每個(gè)子組件都可以指定如下兩個(gè)XML屬性:Layout_x:指定該子組件的X坐標(biāo)Layout_y:指定該子組件的Y坐標(biāo)布局管理器絕對(duì)布局當(dāng)使用絕對(duì)布局時(shí),要多次調(diào)整各個(gè)組件的位置才能達(dá)到預(yù)期的效果,調(diào)整時(shí)使用到的單位有以下幾種:px(像素):每個(gè)px對(duì)應(yīng)屏幕上的一點(diǎn)dip或dp(deviceindependentpixels設(shè)備獨(dú)立像素):是一種基于屏幕密度的抽象單位。當(dāng)在每英寸160px的屏幕上時(shí),1dp=1px。但隨著屏幕密度的改變,它們之間的換算會(huì)發(fā)生改變。sp(scaledpixels比例像素):主要用于處理Android中的字體大小。Android中最常用的兩種單位是dp和sp,其中dp一般為間距單位,sp一般設(shè)置字體大小單位。<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.androi /apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="使用XML布局文件控制UI界面"android:textColor="#ff0000"android:textSize="18sp"android:layout_centerInParent="true"/></RelativeLayout>相對(duì)布局繼承自ViewGroupTextView控件繼承自View界面布局編寫方式設(shè)置文字的樣式在Java代碼中編寫布局RelativeLayoutrelativeLayout=newRelativeLayout(this);RelativeLayout.LayoutParamsparams=newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);//addRule參數(shù)對(duì)應(yīng)RelativeLayoutXML布局的屬性params.addRule(RelativeLayout.CENTER_IN_PARENT);//設(shè)置居中顯示TextViewtextView=newTextView(this);//創(chuàng)建TextView控件textView.setText("Java代碼實(shí)現(xiàn)界面布局");//設(shè)置TextView的文字內(nèi)容textView.setTextColor(Color.RED);//設(shè)置TextView的文字顏色textView.setTextSize(18);//設(shè)置TextView的文字大小//添加TextView對(duì)象和TextView的布局屬性relativeLayout.addView(textView,params);setContentV
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年一級(jí)建造師考試核心知識(shí)點(diǎn)與實(shí)操題庫大全
- 2026年鋼琴演奏基本技術(shù)與音樂鑒賞考核題
- 2026年社交媒體營銷技巧與實(shí)踐能力試題
- 2026年英語教育托福聽力技巧與解題策略題庫
- 2026年語言培訓(xùn)教師課堂組織實(shí)操練習(xí)題
- 2026年電氣工程師考試電工基礎(chǔ)理論試題解析
- 2026年金融分析師投資策略分析題集
- 2026年房地產(chǎn)銷售顧問專業(yè)知識(shí)筆試模擬題
- 2026年編程達(dá)人進(jìn)階訓(xùn)練算法與數(shù)據(jù)結(jié)構(gòu)核心題集
- 2026年物流管理專業(yè)知識(shí)測試題及解析手冊(cè)
- 2025年及未來5年市場數(shù)據(jù)中國軟包裝用復(fù)合膠行業(yè)市場調(diào)研分析及投資戰(zhàn)略咨詢報(bào)告
- 斜拉橋的未來發(fā)展
- 柴油發(fā)電機(jī)操作與維護(hù)手冊(cè)
- 巡察流程培訓(xùn)會(huì)課件
- 項(xiàng)目管理施工合同范本
- 全國物業(yè)管理法律法規(guī)及案例解析
- 抖音來客本地生活服務(wù)酒旅酒店民宿旅游景區(qū)商家代運(yùn)營策劃方案
- 北侖區(qū)打包箱房施工方案
- 車載光通信技術(shù)發(fā)展及無源網(wǎng)絡(luò)應(yīng)用前景
- 2026屆上海市金山區(qū)物理八年級(jí)第一學(xué)期期末調(diào)研試題含解析
- 2026年數(shù)學(xué)競賽希望杯-三年級(jí)100題培訓(xùn)題練習(xí)含答案
評(píng)論
0/150
提交評(píng)論