Android學(xué)習(xí)筆記(入門必看)_第1頁
Android學(xué)習(xí)筆記(入門必看)_第2頁
Android學(xué)習(xí)筆記(入門必看)_第3頁
Android學(xué)習(xí)筆記(入門必看)_第4頁
Android學(xué)習(xí)筆記(入門必看)_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、.android學(xué)習(xí)筆記(by quqi99 msn: )android platform是一個用于開發(fā)移動程序的軟件包,它包括了操作系統(tǒng)、中間件及一些關(guān)鍵應(yīng)用。開發(fā)者能使用android sdk為android platform開發(fā)應(yīng)用,這些應(yīng)用使用java語言書寫,運(yùn)行在虛擬機(jī)dalvik(一個專為手機(jī)程序開發(fā)的基于linux內(nèi)核的java虛擬機(jī))。/wiki/index.php?title=%e7%bf%bb%e8%af%91%e4%bb%bb%e5%8a%a1%e9%a2%86%e5%8f%96&printabl

2、e=yes /forumdisplay.php?fid=2 1 什么是android1.1 android的特性 應(yīng)用框架,讓一些基礎(chǔ)設(shè)施得以重用 dalvik虛擬機(jī),專為開發(fā)移動程序優(yōu)化 集成的瀏覽器,(基于webkit引擎) 優(yōu)化的圖形庫,(2d圖形庫以及基于opengl es 1.0規(guī)范的3d圖形庫) sqlite,用于結(jié)構(gòu)化數(shù)據(jù)的存儲,是一個數(shù)據(jù)庫 多媒體支持,支持多種音頻,視頻格式(mpeg4, h.264, mp3, aac, amr, jpg, png, gif) gsm技術(shù)(依賴具體硬件) bluetooth, edge, 3g,

3、wifi(依賴具體硬件) camera, gps, compass, accelerometer(依賴具體硬件) 豐富的開發(fā)環(huán)境(debug工具,內(nèi)存及性能工具,eclipse的插件等)1.2 android的架構(gòu) android操作系統(tǒng)的模塊如下: 應(yīng)用:android已集成了一些應(yīng)用,如郵件客戶端,sms程序,日歷,地圖,瀏覽器等 應(yīng)用框架: 程序庫: 例行程序 linux內(nèi)核2 andvoid起步2.1 開發(fā)環(huán)境配置 使用eclipse + android development tools (adt)插件。在help software updates find and install.

4、中鍵入更新地址:/android/eclipse/2.2 運(yùn)行第一個andvoid程序使用eclipse插件 1、建立的工程類型為:andvoid project 2、建立launch configuration. run open run dialog. or run open debug dialog命令行運(yùn)行程序 1、創(chuàng)建工程 activitycreator .activityname 2、編譯。在build.xml所在的目錄ant一下。 3、啟動模擬器. 運(yùn)行命令:emulator 4、在模擬器中,切換到

5、主屏幕。 5、在命令行輸入: adb install myproject/bin/.apk將其上載至模擬器。 6、在模擬器中選擇程序并啟動。android需要專門的編譯工具來正確的編譯資源文件和android程序的其他部分?;诖?,你需要為你的程序準(zhǔn)備一個專門的編譯環(huán)境。 andorid的編譯過程通常包括編譯xml和其他資源文件、創(chuàng)建正確的輸入格式。經(jīng)過編譯的android程序是一個.apk文件,.apk文件是一個壓縮文件,它其中包含了.dex文件、資源文件、raw data文件和其他文件。 andoriod暫時還不支持用本地代碼(c/c+)開發(fā)第三方程序。移除andorid程序要移除你安裝在

6、模擬器上的程序,你需要通過run adb并刪除相應(yīng)的.apk文件。通過adb shell命令在模擬器上打開一個unix shell,進(jìn)入目錄data/app/,通過命令rm 你程序的名稱.apk來移除文件。2.3 調(diào)試程序 andvoid用于調(diào)試的手段有: ddms,ddms是一個圖形化的程序,支持端口轉(zhuǎn)發(fā)(因此你可以在程序中設(shè)置斷點(diǎn)),支持模擬器上的截屏,支持線程和堆棧信息和其他的一些特性。 logcat,dump一份系統(tǒng)消息的日志。這些消息包括模擬器拋出錯誤時的堆棧跟蹤。 android log, 打印日志的類,用來將消息寫入模擬器上的日志文件中。如log.v()用于打印verbose級別

7、的日志 traceview,android可以保存一個日志用來記錄被調(diào)用的方法以及該方法被調(diào)用的次數(shù),通過traceview你可以在一個圖形化的界面中查看這個日志文件。 可接解設(shè)置emulator的設(shè)置以方便調(diào)試,模擬器上調(diào)試和測試的設(shè)置 android提供了眾多的設(shè)置使你可以更容易的調(diào)試和測試程序。要進(jìn)入開發(fā)設(shè)置頁面,在模擬器中轉(zhuǎn)到dev tools development settings。在該設(shè)置頁面有以下選項(xiàng): debug app:選擇要調(diào)試的程序。你不需要設(shè)定其關(guān)聯(lián)至調(diào)試器,但是設(shè)定這個值有兩個效果: o 在調(diào)試的時候,如果你在一個斷點(diǎn)處暫停了過長的時間,這個設(shè)定會防止android

8、拋出一個錯誤 o 這個設(shè)定使你可以選擇“等待調(diào)試器”選項(xiàng),使程序只有在調(diào)試器關(guān)聯(lián)上之后才啟動 wait for debugger:阻塞所選的程序的加載直到有調(diào)試器關(guān)聯(lián)上,這樣你就可以在oncreate()中設(shè)置斷點(diǎn),這對于調(diào)試一個activity的啟動進(jìn)程是非常重要的。當(dāng)你對該選項(xiàng)進(jìn)行了更改,任何正在運(yùn)行的程序的實(shí)例都會被終止。你只有在上面的選項(xiàng)中選擇了一個調(diào)試程序才能夠選中該選項(xiàng)。你一也可以在代碼中添加waitfordebugger()來實(shí)現(xiàn)同樣的功能。 immediately destroy activities:告訴系統(tǒng)一旦一個activity停止了就銷毀該activity(例如當(dāng)and

9、roid釋放內(nèi)存的時候)。這對于測試代碼onfreeze(bundle)/oncreate(android.os.bundle)是非常有用的,否則會比較困難。如果你的程序沒有保存狀態(tài),那么選擇這個選項(xiàng)很可能會引發(fā)很多問題。 show screen updates:對于任何正在被重繪的screen sections都會在其上閃現(xiàn)一個粉紅色的矩形。這對于發(fā)現(xiàn)不必要的screen繪制是很有必要的。 show cpu usage:在屏幕上方顯示cpu信息,顯示有多少cpu資源正在被使用。上方紅色條顯示總的cpu使用率,它下方綠色的條顯示cpu用在compositing the screen上的時間。注

10、意:在沒有重啟模擬器之前,一旦你開啟了該功能就不能關(guān)閉。 show screen fps:顯示當(dāng)前的幀率。這對于查看游戲達(dá)到的總的幀率是非常有用的。注意:在沒有重啟模擬器之前,一旦你開啟了該功能就不能關(guān)閉。 show background:當(dāng)沒有activity screens可見時,顯示一個背景模式。一般是不會出現(xiàn)的,僅僅在debug的時候會出現(xiàn)。 設(shè)定的選項(xiàng)在模擬器重啟之后仍然有效,如果要取消設(shè)定的選項(xiàng),在取消設(shè)定以后還要重啟模擬器,才能生效。2.4 andvoid中的概念 一個andvoid應(yīng)用包括四個部分:n activity活動 (個人認(rèn)為 :類似于jsp, 也相當(dāng)于swt中的she

11、ll, view則相當(dāng)于wegiet)n intent receiver (個人認(rèn)為 :類似于struts action)n service (個人認(rèn)為 :類似于servlet)n content provider (個人認(rèn)為 :用于持久化)用上面哪些組件,要在androidmanifest.xml文件中聲明。1、 activity. 一個activity是應(yīng)用中的一個單一的屏幕,它繼承自activity類,它將顯示由views組成的ui以及響應(yīng)事件。(個人理解,相當(dāng)于jsp)2、 intent與intent filters. intent用于從一個屏幕跳到別一個屏幕,描述一個應(yīng)用想做什么,它

12、的數(shù)據(jù)結(jié)構(gòu)包括action與data兩部分,action如main、view、pick、edit等等, data被表達(dá)成一個uri;intentfilter相當(dāng)于告訴跳到哪個activity,;intentreceiver用于響應(yīng)事件,雖然它不顯示ui,但它可以用notificationmanager去通知用戶。它需要在androidmanifest.xml文件中注冊,或者是用context.registerreceiver()硬編碼。3、 service是一段有生命周期的無ui的代碼。4、 content provider, 持久化,例如存儲在文件系統(tǒng)中,或者存儲在sqlite數(shù)據(jù)庫中。2.

13、5 例子 1,下載例子工程。/android/intro/codelab/notepadcodelab.zip 例如:notepadv1工程是問題工程,notepadv1solution則是相應(yīng)的解決工程。 2,3個例子的函義如下:通過練習(xí)11. 數(shù)據(jù)庫對象的例子程序2. 如何在一個activity初始化的時候創(chuàng)建數(shù)據(jù)庫對象3. 如何為一個activity創(chuàng)建一個pop菜單4. 如何得到一個用戶在pop菜單中選擇的item 的id5. 如何向一個listview中寫入數(shù)據(jù)通過練習(xí)21 如何取得數(shù)據(jù)集中被選擇數(shù)據(jù)行的id, 注意rows是java的一個l

14、istarray對象,所以它有它的getselection()的方法2 如何調(diào)用一個subactivity以及在調(diào)用一個subactivity之前應(yīng)該做些事情。3 要實(shí)現(xiàn)一個方法, 當(dāng)subactivity返回后,應(yīng)該做些什么4 關(guān)于layout。由于android采用mvc的模式, 所以屏幕的布局采用了xml進(jìn)行定義。一個好的布局會讓程序顯的更漂亮。可以參考/android/reference/view-gallery.html, 有很多的布局模式可供利用。5 如何創(chuàng)建一個開始的時候代碼中不含oncreate()的類,因?yàn)榈侥壳盀橹惯€沒有創(chuàng)建過自己的

15、類,以前看到的類和修改的方法都是已經(jīng)寫好的了。不過這個類也是一個從android.app.activity繼承的。創(chuàng)建后還是要通過source override一個oncreate的6 從一個subactivity返回時,在返回之前應(yīng)該做哪些事情7 如何在androidmanifest.xml中聲明一個新的activity8 如何創(chuàng)建一個內(nèi)部隱含的onclicklister及實(shí)現(xiàn)其應(yīng)有的功能。通過練習(xí)31. 除了oncreate()還有哪些和lifecycle有關(guān)的方法a.onfreeze():b.onpause()c.onresume()等等2. 大部分程序都有必要考慮lifecycle的問

16、題,應(yīng)該把下面的這個圖記?。?3. 為了不丟失需要保存的信息,要明確的理解activity的各個狀態(tài),并相應(yīng)的給出在各個狀態(tài)的行為。4開始的時候?qū)τ趏nfreeze()和onpause()有些理解上的困難,要多讀幾遍doc來會理解。通過額外練習(xí)進(jìn)一步的理解lifecycle和通過手機(jī)按鍵進(jìn)行操作時的時間和程序狀態(tài)關(guān)系另外,sdk目錄下也有一些例子。練習(xí)目標(biāo):1. 使用listactivities,并使用菜單2. 學(xué)習(xí)使用操作sqlite數(shù)據(jù)庫3. 使用arrayadapter綁定數(shù)據(jù)到listview中4. 掌握一些基本的操作,如菜單的顯示,菜單命令的處理,增加數(shù)據(jù)項(xiàng)等。第一步:在sdk中下載

17、獲得notepadv1的代碼,并導(dǎo)入到eclipse中。導(dǎo)入步驟:a. 在package explorer中,右鍵選擇import./general/existing projects into workspaceb. 點(diǎn)browse按鈕,選擇notepadv1 的目錄,并點(diǎn)okc. 你將會看到notepadv1被列在項(xiàng)目區(qū)中,默認(rèn)會被打勾,如果沒有打勾,請手動勾上。d. 點(diǎn)finishe. notepadv1將被列在package explorer中f. 如果有提示關(guān)于androidmanifest.xml的錯誤,請選中此項(xiàng)目,并右鍵選擇android tools-fix project,他

18、將會自動幫你修復(fù)錯誤。第二步:看一下數(shù)據(jù)庫操作類:dbhelper,還是比較簡單的,自己看去 :)。第三步:打開res/layout/notepad_list.xml 這個文件,快速的看下就可以了:a., xml文件的固定頭b.一個layout的定義,這里是 linearlayout,但不一定是這個,可以是其他的layout第四步:在上面的那個文件中加入: a. listview和textview不會同是顯示,如果沒有數(shù)據(jù),則默認(rèn)顯示textview(這個view里會顯示一個字符串)。如果有數(shù)據(jù),則會顯示listview。b.是默認(rèn)的關(guān)鍵字,xml解析器將會自動替換這個符號后面的idc.and

19、roid:list 和android:empty 是android平臺預(yù)定義好的id,如果你想顯示空的textview,可以調(diào)用setemptyview().第五步:建立一個新文件res/layout/notes_row.xml,文件內(nèi)容如下:然后保存,r.java下將會自動刷新。第六步改變繼承類public class notepadv1 extends listactivity第七步:看一下這三個事件:oncreate():界面初始化的時候調(diào)用oncreateoptionsmenu():按了menu按鈕的時候調(diào)用onoptionsitemselected() :選擇了一個菜單項(xiàng)的時候調(diào)用第

20、八步:改寫oncreate函數(shù): private dbhelper dbhelper; override public void oncreate(bundle icicle) super.oncreate(icicle); setcontentview(r.layout.notepad_list); dbhelper = new dbhelper(this); filldata(); 第九步:在strings.xml 中增加:add item并在notepadv1類中加入:public static final int insert_id = menu.first;改寫oncreateopt

21、ionsmenu() override public boolean oncreateoptionsmenu(menu menu) boolean result = super.oncreateoptionsmenu(menu); menu.add(0, insert_id, r.string.menu_insert); return result; 第十步:改寫onoptionsitemselected() override public boolean onoptionsitemselected(item item) switch (item.getid() case insert_id:

22、 createnote(); break; return super.onoptionsitemselected(item); 第十一步:實(shí)現(xiàn)兩個函數(shù):private void createnote() string notename = note + notenumber+; dbhelper.createrow(notename, ); filldata(); private void filldata() / we need a list of strings for the list items list items = new arraylist(); / get all of th

23、e rows from the database and create the item list list rows = dbhelper.fetchallrows(); for (row row : rows) items.add(row.title); / now create an array adapter and set it to display using our row arrayadapter notes = new arrayadapter(this, r.layout.notes_row, items); /指定notes_row視圖,作為數(shù)據(jù)容器。 setlistad

24、apter(notes); 第十二步:運(yùn)行:run as - android application 2.6 開發(fā)工具2.6.1 仿真器 仿真器是在計(jì)算機(jī)中運(yùn)行的一個虛擬的移動裝置,用它來設(shè)計(jì)、調(diào)試應(yīng)用。2.6.2 adtadt是一個用于開發(fā)andvoid應(yīng)用的確良eclipse插件,它方便了我們的開發(fā)。例如,它讓我們方便從eclipse內(nèi)部訪問ddms工具(可用于截屏,管理port-forwarding,設(shè)斷點(diǎn),查看線程和進(jìn)程信息)2.6.3 ddmsddms(dalvik debug monitor service)和dalvik虛擬機(jī)集成,將在ide和模擬器起到一個轉(zhuǎn)發(fā)服務(wù)。用它能管理仿

25、填器或者設(shè)備的進(jìn)程,并且輔助調(diào)試。你可用它殺死進(jìn)程,選擇某一進(jìn)程去debug,產(chǎn)生trace數(shù)據(jù),查看堆和線程信息等等。2.6.4 adbadb(andvoid debug bridge)。在命令行操作。它能安裝.apk文件到仿真器上等等。用于將文件發(fā)送到仿真器。adb(android debug bridge)是android提供的一個通用的調(diào)試工具,借助這個工具,我們可以管理設(shè)備或手機(jī)模擬器的狀態(tài)。還可以進(jìn)行以下的操作:1、快速更新設(shè)備或手機(jī)模擬器中的代碼,如應(yīng)用或android系統(tǒng)升級;2、在設(shè)備上運(yùn)行shell命令;3、管理設(shè)備或手機(jī)模擬器上的預(yù)定端口;4、在設(shè)備或手機(jī)模擬器上復(fù)制或粘

26、貼文件;以下為一些常用的操作:1、安裝應(yīng)用到模擬器:adb install 比較郁悶的是,android并沒有提供一個卸載應(yīng)用的命令,只能自己手動刪除:adb shellcd /data/apprm app.apk2、進(jìn)入設(shè)備或模擬器的shell:adb shell通過上面的命令,就可以進(jìn)入設(shè)備或模擬器的shell環(huán)境中,在這個linux shell中,你可以執(zhí)行各種linux的命令,另外如果只想執(zhí)行一條shell命令,可以采用以下的方式:adb shell command如:adb shell dmesg會打印出內(nèi)核的調(diào)試信息。3、發(fā)布端口:你可以設(shè)置任意的端口號,做為主機(jī)向模擬器或設(shè)備的請

27、求端口。如:adb forward tcp:5555 tcp:80004、復(fù)制文件:你可向一個設(shè)備或從一個設(shè)備中復(fù)制文件,復(fù)制一個文件或目錄到設(shè)備或模擬器上:adb push 如:adb push test.txt /tmp/test.txt從設(shè)備或模擬器上復(fù)制一個文件或目錄:adb pull 如:adb pull /addroid/lib/libwebcore.so .5、搜索模擬器/設(shè)備的實(shí)例:取得當(dāng)前運(yùn)行的模擬器/設(shè)備的實(shí)例的列表及每個實(shí)例的狀態(tài):adb devices6、查看bug報告:adb bugreport7、記錄無線通訊日志:一般來說,無線通訊的日志非常多,在運(yùn)行時沒必要去記錄

28、,但我們還是可以通過命令,設(shè)置記錄:adb shelllogcat -b radio8、獲取設(shè)備的id和序列號:adb get-productadb get-serialno9、訪問數(shù)據(jù)庫sqlite3adb shellsqlite32.6.5 aapt aapt(andvoid asset packaging tool),用于創(chuàng)建.apk文件。2.6.6 aidlaidl(andvoid interface description language)用于產(chǎn)生代碼。2.6.7 sqlite3用于訪問sqlite數(shù)據(jù)文件。2.6.8 traceview 查看log信息2.6.9 mksdcard

29、 helps you create a disk image that you can use with the emulator, to simulate the presence of an external storage card (such as an sd card2.6.10 dx dx工具用于重寫.class字節(jié)碼到andvoid字節(jié)碼2.6.11 activitycreator 用于產(chǎn)生ant文件的腳本。當(dāng)然,若用eclipse插件就不需要它了。2.7 andvoid應(yīng)用的生命周期在大部份情況下,每個android應(yīng)用都將運(yùn)行在自己的linux進(jìn)程當(dāng)中。當(dāng)這個應(yīng)用的某些代碼需

30、要執(zhí)行時,進(jìn)程就會被創(chuàng)建,并且將保持運(yùn)行,直到該進(jìn)程不再需要,而系統(tǒng)需要釋放它所占用的內(nèi)存,為其他應(yīng)用所用時,才停止。 android一個重要并且特殊的特性就是,一個應(yīng)用的進(jìn)程的生命周期不是由應(yīng)用自身直接控制的,而是由系統(tǒng),根據(jù)運(yùn)行中的應(yīng)用的一些特征來決定的,包括:這些應(yīng)用對用戶的重要性、系統(tǒng)的全部可用內(nèi)存。 對于應(yīng)用開發(fā)者來說,理解不同的應(yīng)用組件(特別是activity、service、intent receiver)對應(yīng)用進(jìn)程的生命周期的影響,這是非常重要的。如果沒有正確地使用這些組件,將會導(dǎo)致當(dāng)應(yīng)用正在處理重要的工作時,進(jìn)程卻被系統(tǒng)消毀的后果。 對于進(jìn)程生命周期,一個普遍的錯誤就是:當(dāng)一

31、個intent receiver在它的onreceiveintent()方法中,接收到一個intent后,就會從這個方法中返回。而一旦從這個方法返回后,系統(tǒng)將會認(rèn)為這個intent receiver不再處于活動狀態(tài)了,也就會認(rèn)為它的宿主進(jìn)程不需要了(除非宿主進(jìn)程中還存在其它的應(yīng)用組件)。從而,系統(tǒng)隨時都會消毀這個進(jìn)程,收回內(nèi)存,并中止其中還在運(yùn)行的子線程。問題的解決辦法就是,在intentreceiver中,啟動一個service,這樣系統(tǒng)就會知道在這個進(jìn)程中,還有活動的工作正在執(zhí)行。 為了決定在內(nèi)存不足情況下消毀哪個進(jìn)程,android會根據(jù)這些進(jìn)程內(nèi)運(yùn)行的組件及這些組件的狀態(tài),把這些進(jìn)程劃

32、分出一個“重要性層次”。這個層次按順序如下: 1、前端進(jìn)程是擁有一個顯示在屏幕最前端并與使用者做交互的activity(它的onresume已被調(diào)用)的進(jìn)程,也可能是一個擁有正在運(yùn)行的intentreceiver(它的onreceiveintent()方法正在運(yùn)行)的進(jìn)程。在系統(tǒng)中,這種進(jìn)程是很少的,只有當(dāng)內(nèi)存低到不足于支持這些進(jìn)程的繼續(xù)運(yùn)行,才會將這些進(jìn)程消毀。通常這時候,設(shè)備已經(jīng)達(dá)到了需要進(jìn)行內(nèi)存整理的狀態(tài),為了保障用戶界面不停止響應(yīng),只能消毀這些進(jìn)程; 2、可視進(jìn)程是擁有一個用戶在屏幕上可見的,但并沒有在前端顯示的activity(它的onpause已被調(diào)用)的進(jìn)程。例如:一個以對話框顯

33、示的前端activity在屏幕上顯示,而它后面的上一級activity仍然是可見的。這樣的進(jìn)程是非常重要的,一般不會被消毀,除非為了保障所有的前端進(jìn)程正常運(yùn)行,才會被消毀。 3、服務(wù)進(jìn)程是擁有一個由startservice()方法啟動的service的進(jìn)程。盡管這些進(jìn)程對于使用者是不可見的,但他們做的通常是使用者所關(guān)注的事情(如后臺mp3播放器或后臺上傳下載數(shù)據(jù)的網(wǎng)絡(luò)服務(wù))。因此,除非為了保障前端進(jìn)程和可視進(jìn)程的正常運(yùn)行,系統(tǒng)才會消毀這種進(jìn)程。 4、后臺進(jìn)程是擁有一個用戶不可見的activity(onstop()方法已經(jīng)被調(diào)用)的進(jìn)程。這些進(jìn)程不直接影響用戶的體驗(yàn)。如果這些進(jìn)程正確地完成了自己

34、的生命周期(詳細(xì)參考activity類),系統(tǒng)會為了以上三種類型進(jìn)程,而隨時消毀這種進(jìn)程以釋放內(nèi)存。通常會有很多這樣的進(jìn)程在運(yùn)行著,因些這些進(jìn)程會被保存在一個lru列表中,以保證在內(nèi)存不足時,用戶最后看到的進(jìn)程將在最后才被消毀。 5、空進(jìn)程是那些不擁有任何活動的應(yīng)用組件的進(jìn)程。保留這些進(jìn)程的唯一理由是,做為一個緩存,在它所屬的應(yīng)用的組件下一次需要時,縮短啟動的時間。同樣的,為了在這些緩存的空進(jìn)程和底層的核心緩存之間平衡系統(tǒng)資源,系統(tǒng)會經(jīng)常消毀這些空進(jìn)程。 當(dāng)要對一個進(jìn)程進(jìn)行分類時,系統(tǒng)會選擇在這個進(jìn)程中所有活動的組件中重要等級最高的那個做為依據(jù)??梢詤⒖糰ctivity、service、int

35、entreceiver文檔,了解這些組件如何影響進(jìn)程整個生命周期的更多細(xì)節(jié)。這些類的文檔都對他們?nèi)绾斡绊懰麄兯鶎俚膽?yīng)用的整個生命周期,做了詳細(xì)的描述。2 開發(fā)應(yīng)用2.1 前端ui2.1.1 .屏幕元素的層次 1. views 一個view是android.view.view基礎(chǔ)類的一個對象,它是一個有屏幕上特定的一個矩形內(nèi)布局和內(nèi)容屬性的數(shù)據(jù)結(jié)構(gòu)。一個view對象處理測量和布局,繪圖,焦點(diǎn)變換,滾動條,還有屏幕區(qū)域自己表現(xiàn)的按鍵和手勢。 view類作為一個基類為widget(窗體部件)服務(wù),widget-是一組用于繪制交互屏幕元素的完全實(shí)現(xiàn)子類。widget處理它們自己的測距和繪圖,所以你可以

36、更快速地用它們?nèi)?gòu)建你的ui??捎玫降膚idget包括text,edittext,inputmethod,button,radiobutton,checkbox,和scrollview。2. viewgroups一個viewgroup是一個android.view.viewgroup類的對象。一個viewgroup是一個特殊的view對象,它的功能是去裝載和管理一組下層的view和其他viewgroup,viewgroup讓你可以為你的ui增加結(jié)構(gòu)并且將復(fù)雜的屏幕元素構(gòu)建成一個獨(dú)立的實(shí)體。 viewgroup類作為一個基類為layout(布局)服務(wù),layout-是一組提供屏幕界面通用類型的完

37、全實(shí)現(xiàn)子類。layout讓你可以為一組view構(gòu)建一個結(jié)構(gòu)。3. a tree-structured ui 在android平臺上,你用view樹和viewgroup節(jié)點(diǎn)來定義一個activity的ui,就如同下面圖表一樣。這個樹可以如你需要那樣簡單或者復(fù)雜,并且你可以使用android的預(yù)定義widget和layout或者你自定義的view類型來構(gòu)建它。 要將屏幕綁定一個樹以便于渲染,你的activity調(diào)用它的setcontentview()方法并且傳遞一個參數(shù)給根節(jié)點(diǎn)對象。一旦android系統(tǒng)獲得了根節(jié)點(diǎn)的參數(shù),它就可以直接通過節(jié)點(diǎn)來無效化,測距和繪制樹。當(dāng)你的activity被激活并

38、且獲得焦點(diǎn)時,系統(tǒng)會通知你的activity并且請求根節(jié)點(diǎn)去測距并繪制樹,根節(jié)點(diǎn)就會請求它的子節(jié)點(diǎn)去繪制它們自己。每個樹上的viewgroup節(jié)點(diǎn)都為它的子節(jié)點(diǎn)的繪制負(fù)責(zé)。 正如之前提到的,每個view group都有測量它的有效空間,布局它的子對象,并且調(diào)用每個子對象的draw()方法去繪制它們自己。子對象可能會請求獲得一個它們在父對象中的大小和位置,但是父對象對于每個子對象的大小和位置有最終的決定權(quán)。4. layoutparams:一個子對象如何指定它的位置和大小每個viewgroup類都會使用一個繼承于viewgroup.layoutparams的嵌套類。這個子類包含了包含了定義一個子對

39、象位置和大小的屬性類型,并且需適用于view group類。 要注意的是,每個layoutparams子類都有它自己賦值的語法。每個子元素必須定義適用于它們父對象的layoutparams,盡管父對象可能會為子元素定義不同的layoutparams。 所有的viewgroup都包括寬和高。很多還包括邊界的定義(margin和border)。你可以非常精確地描述寬和高,盡管你并不想經(jīng)常這么做。更多時候你希望你的view自行調(diào)整到適應(yīng)內(nèi)容大小,或者適應(yīng)容器大小。2.1.2.通用布局對象(最普遍的view groups)1. framelayout (上下壓著的那種) framelayout是最簡單

40、的一個布局對象。它被定制為你屏幕上的一個空白備用區(qū)域,之后你可以在其中填充一個單一對象 比如,一張你要發(fā)布的圖片。所有的子元素將會固定在屏幕的左上角;你不能為framelayout中的一個子元素指定一個位置。后一個子元素將會直接在前一個子元素之上進(jìn)行覆蓋填充,把它們部份或全部擋?。ǔ呛笠粋€子元素是透明的)。 2. linearlayout linearlayout以你為它設(shè)置的垂直或水平的屬性值,來排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一個垂直列表的每一行只會有一個元素,而不管他們有多寬,而一個水平列表將會只有一個行高(高度為最高子元素的高度加上邊框高度)。linearl

41、ayout保持子元素之間的間隔以及互相對齊(相對一個元素的右對齊、中間對齊或者左對齊)。 linearlayout還支持為單獨(dú)的子元素指定weight。好處就是允許子元素可以填充屏幕上的剩余空間。這也避免了在一個大屏幕中,一串小對象擠成一堆的情況,而是允許他們放大填充空白。子元素指定一個weight值,剩余的空間就會按這些子元素指定的weight比例分配給這些子元素。默認(rèn)的weight值為0。例如,如果有三個文本框,其中兩個指定了weight值為1,那么,這兩個文本框?qū)⒌缺壤胤糯螅⑻顫M剩余的空間,而第三個文本框不會放大。 tip:為了在屏幕上創(chuàng)建一個按比例安排大小的layout,需要根據(jù)這

42、個屏幕上每個元素將按什么比例顯示,創(chuàng)建一個指定fill_parent,子元素的height或width為0,且為每一個子元素分配weight值的容器對象。下面的兩個窗體采用linearlayout,包含一組的元素:一個按鈕,幾個標(biāo)簽,幾個文本框。兩個窗體都為布局做了一番修飾。文本框的width被設(shè)置為fill_parent;其它元素的width被設(shè)置為wrap_content。默認(rèn)的對齊方式為左對齊。左邊的窗體沒有設(shè)置weight(默認(rèn)為0);右邊的窗體的comments文本框weight被設(shè)置為1。如果name文本框也被設(shè)置為1,那么name和comments這兩個文本框?qū)型瑯拥母叨取T?/p>

43、一個水平排列的linearlayout中,各項(xiàng)按他們的文本基線進(jìn)行排列(第一列第一行的元素,即最上或最左,被設(shè)定為參考基線)。因此,人們在一個窗體中檢索元素時,就不需要七上八下地讀元素的文本了。我們可以在layout的xml中設(shè)置android:baselinealigned=false,來關(guān)閉這個設(shè)置。3. tablelayout tablelayout將子元素的位置分配到行或列中。一個tablelayout由許多的tablerow組成,每個tablerow都會定義一個row(事實(shí)上,你可以定義其它的子對象,這在下面會解釋到)。tablelayout容器不會顯示row、cloumns或cel

44、l的邊框線。每個row擁有0個或多個的cell;每個cell擁有一個view對象。表格由列和行組成許多的單元格。表格允許單元格為空。單元格不能跨列,這與html中的不一樣。下圖顯示了一個tablelayout,圖中的虛線代表不可視的單元格邊框。 列可以被隱藏,也可以被設(shè)置為伸展的從而填充可利用的屏幕空間,也可以被設(shè)置為強(qiáng)制列收縮直到表格匹配屏幕大小。對于更詳細(xì)信息,可以查看這個類的參考文檔。4. absolutelayout absolutelayout可以讓子元素指定準(zhǔn)確的x/y坐標(biāo)值,并顯示在屏幕上。(0, 0)為左上角,當(dāng)向下或向右移動時,坐標(biāo)值將變大。absolutelayout沒有頁

45、邊框,允許元素之間互相重疊(盡管不推薦)。我們通常不推薦使用absolutelayout,除非你有正當(dāng)理由要使用它,因?yàn)樗菇缑娲a太過剛性,以至于在不同的設(shè)備上可能不能很好地工作。 5. relativelayout relativelayout允許子元素指定他們相對于其它元素或父元素的位置(通過id指定)。因此,你可以以右對齊,或上下,或置于屏幕中央的形式來排列兩個元素。元素按順序排列,因此如果第一個元素在屏幕的中央,那么相對于這個元素的其它元素將以屏幕中央的相對位置來排列。如果使用xml來指定這個layout,在你定義它之前,被關(guān)聯(lián)的元素必須定義。 這是一個relativelayout例

46、子,其中有可視的和不可視的元素?;A(chǔ)的屏幕layout對象是一個relativelayout對象。這個視圖顯示了屏幕元素的類名稱,下面是每個元素的屬性列表。這些屬性一部份是由元素直接提供,另一部份是由容器的layoutparams成員(relativelayout的子類)提供。relativelayout參數(shù)有width,height,below,aligntop,toleft,padding和marginleft。注意,這些參數(shù)中的一部份,其值是相對于其它子元素而言的,所以才relativelayout。這些參數(shù)包括toleft,aligntop和below,用來指定相對于其它元素的左,上和

47、下的位置。6. summary of important view groups 重要view group摘要,這些對象擁有ui子元素。一些提供可視的ui,另一些只處理子元素的布局。2.1.3 數(shù)據(jù)綁定 這部分會提及ui有的一些view groups,些組成對象是經(jīng)典adapterview類的子類.例如包括圖像,數(shù)層結(jié)構(gòu)表現(xiàn).這些對象有2個通用的任務(wù): 數(shù)據(jù)層的填充與用戶操作選擇 1. 數(shù)據(jù)層填充 this is typically done by binding the class to an adapter that gets its data from somewhere either

48、a list that the code supplies, or query results from the devices database. / get a spinner and bind it to an arrayadapter that / references a string array.private string fruit = apples, oranges, lemonsspinner s1 = (spinner)findviewbyid(r.id.fruitlist);s1.setadapter(new arrayadapter(this, mstrings);

49、/ load a spinner and bind it to a data query.private string cols=vider.contacts.peoplecolumns.name;private cursor cur = managedquery(vider.contacts.people.content_url, cols, null, null);s2.setadapter(new cursoradapter(cur, this);2. 用戶操作選擇 設(shè)置類的adapterview.onitemclicklistener 方法監(jiān)

50、聽和捕捉用戶的操作事件./ create a message handling object as an anonymous class.private onitemclicklistener mmessageclickedhandler = new onitemclicklistener() public void onitemclick(adapterview parent, view v, int position, long id) / display a messagebox. showalert(youve got an event, clicked me!, ok, false)

51、; ;/ now hook into our object and set its onitemclicklistener member/ to our class handler object. mhistoryview = (listview)findviewbyid(r.id.accept_button);mhistoryview.setonitemclicklistener(mmessageclickedhandler);2.1.4使用xml設(shè)計(jì)你的屏幕顯示1. android定義了大量的自定義元素,各自代表了特定的android顯示子類。2. 你可以象創(chuàng)建html文檔一樣,通過保存在

52、應(yīng)用res/layout/目錄下的xml文件中一系列的嵌套標(biāo)簽來設(shè)計(jì)你的屏幕顯示。3. 每個文檔描述一個android.view.view這個元素既可以是 一個簡單的顯示元素,也可以是一個在子節(jié)點(diǎn)中包含了一個集合的版面設(shè)計(jì)的元素,當(dāng)android編譯你的應(yīng)用時,他將每個文件都編譯進(jìn)android系統(tǒng)。你可以在代碼activity.oncreate()實(shí)現(xiàn)中通過調(diào)用setcontentview(r.layout.layout_file_name)方法加載顯示資源。2.1.5 在屏幕元素中設(shè)置句柄1.您可以使用activity.findviewbyid來取得屏幕上的元素的句柄. 使用該句柄您可以設(shè)

53、置或獲取任何該對象外露的值.textview msgtextview = (textview)findviewbyid(r.id.msg); msgtextview.settext(r.string.push_me);2.2 構(gòu)建組成模塊 android應(yīng)用是由各種各樣的組件來構(gòu)成. 這些組件大部分都是松散聯(lián)接,你可以精確的描述它們的聯(lián)接程度,所以組建的聯(lián)合比單個程序更有結(jié)合力. 顯然,所有的組件運(yùn)行在同一個系統(tǒng)進(jìn)程里面.在這個進(jìn)程里面創(chuàng)建多線程是可以允許的,并且是常見的.如果你需要,也可以對剛才那個系統(tǒng)進(jìn)程創(chuàng)建相互獨(dú)立的子進(jìn)程.即使會有很多實(shí)例運(yùn)行,但是他們之間互不干擾,這個是很難得的,因?yàn)閍ndroid可以確保代碼是進(jìn)程間透明的. 以下部分是很重要的android apis; androidmanifest.xml 是控制文件,告訴所有由高級組件構(gòu)成的系統(tǒng)可以做什么.這些高級的組件包括(特殊activities,服務(wù),接收器,第三方提供商).控制文件用來告訴系統(tǒng)如何使用你所創(chuàng)

溫馨提示

  • 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

提交評論