免费下载 Android编程入门教程
免费下载 Android编程入门教程 InstallAndroid 安裝 Android 開發工具 Android 提供免費而且跨平台的整合開發環境,只要電腦能連接上網路,我們隨時都能下載相關工具下來,並開始開發 Android 應用程式。 有了輕鬆易用的開發工具,我們可以把心力專注於如何將想法實現到應用程式上。 系統需求 撰寫 Android 的應用程式,需要一套個人電腦系統。至於作業系統的部份,幾個主流作業系統都有支援。 支援的作業系統如下: • Windows XP 或 Vista • Mac OS X 10.4.8 或之後版本 (適用 x86 架構的 Intel Mac) • Linux (官方於 Ubuntu 6.10 Dapper Drake 上測試) 我們需要安裝一些 Android 開發環境所需的程式工具,這些工具都是可以免費上網取得的: • JDK 5 或 JDK 6 你需要安裝 Java 開發工具 (JDK 5 或 JDK 6)。 只安裝 Java 運行環境(JRE) 是不夠的,你需要安裝 Java 開發環境 (JDK)。 你可以在命令行上輸入 「java -version」 來查看目前系統上已安裝的 java 版本(java 版本需 >1.5)。 要注意的是 Android 與 Java Gnu 編譯器 (gcj) 還不相容。 • Eclipse IDE,一個多用途的開發工具平台。 你可以下載安裝 Eclipse 3.5 (代號 Galileo) 、 3.4 (代號 Ganymede) 或 Eclipse 3.3 (代號 Europa) 版。 請注意你選擇的版本需包含 Eclipse Java 開發工具擴充套件(Java Development Tool Plugin, JDT)。 大多數 Eclipse IDE 包中都已含有 JDT 擴充套件。若對 Eclipse 平台不熟悉的話,建議直接選擇 「for Java Developers」版本來下載。 • ADT,基於 Eclipse 的 Android 開發工具擴充套件 (Android Development Tools plugin)。 • Android SDK,Android 程式開發套件,包含 Android 手機模擬器(Emulator)。 • 其他開發環境工具(非必要安裝) o Linux 和 Mac 環境上需要自動編譯的話可以自行安裝 Apache Ant 1.6.5 或之後版本,Windows 環境上則需要 Apache Ant 1.7 或之後版本。 o NetBeans、IDEA 等開發平台亦有推出自己的 Android 開發工具,但本書中還是以討論官方基於 Eclipse 平台的開發工具為準,其他平台不予涉及。 安裝流程 假設讀者已先安裝了 JDK 5 或 JDK 6。 那麼 Android 的安裝流程可以分為以下五個步驟 1. 下載 Eclipse 2. 安裝 Eclipse 3. 安裝 ADT 擴充套件 4. 下載 Android SDK 5. 設定 Android SDK 詳細的安裝流程如下: 1. 下載 Eclipse 首先我們需要下載 Android 開發時會用到的整合開發環境 Eclipse。 目前 Android 應用程式只支援使用「Java」程式語言來編寫 Android 應用程式。所以開發前必須先安裝 Java 開發套件(Java Development Kit, JDK)。 各平台的 JDK 可至 http://java.sun.com 下載。 Mac OS X 作業系統則已內建 JDK。 安裝好 JDK 後,我們可以前往 Eclipse 網站下載 Eclipse 這個方便的整合開發環境。 下載 Eclipse 時請選「Eclipse IDE for Java Developers」或「Eclipse IDE for Java EE Developers」這兩種版本,只有這兩種版本才會預裝 Eclipse JDT 擴充套件。 範例中所選擇的是「Eclipse IDE for Java Developers」版本。 下載完同樣先解壓縮到適當目錄下。 2. 安裝 Eclipse Eclipse 不需要安裝,只要確認你的系統上有安裝 Java,即可直接開啟 Eclipse 資料夾,點擊 Eclipse 開始執行 Eclipse 整合開發環境。 第一次啟動 Eclipse 時會彈出視窗讓你決定預設的工作目錄。一般使用 Eclipse 預設的工作目錄即可。 進入到 Eclipse IDE 後,不必急著四處觀望。我們先來安裝 Android 開發工具擴充套件。 3. 安裝 ADT 擴充套件 我們將在 Eclipse 上 安裝 Android 開發工具 (ADT)。 Eclipse 3.5 版 找到螢幕上方的選單列, 選擇 「Help->Install New Softare」 選項,這選項會帶出一個新視窗。 選擇「Available Software」標籤,選擇右方的 「Add...」 (新增網站)按鈕,會彈出一個輸入框。 在輸入框中的"Location"欄位中輸入擴充套件的名稱(Name) 「ADT」 跟網址(URL) 「http://dl-ssl.google.com/android/eclipse/site.xml 」,按下 "OK" 按鈕離開。Eclipse 會花一點時間尋找合適的版本。 在視窗中全選「 https://dl-ssl.google.com/android/eclipse/site.xml 」項目「Developer Tools」中的的選項後,按下右方的「Install」按鈕。 按下 「Next」 (下一步)鍵。照著步驟就安裝完成。安裝完會提示需重新啟動 Eclipse,按下 「Yes」 重新啟動。 Eclipse 3.4 版 找到螢幕上方的選單列, 選擇 「Help->Software Updates」 選項,這選項會帶出一個新視窗。 選擇「Available Software」標籤,選擇右方的 「Add Site...」 (新增網站)按鈕,會彈出一個輸入框。 在輸入框中的"Location"欄位中輸入網址(URL) 「http://dl-ssl.google.com/android/eclipse/site.xml 」, 按下 "OK" 按鈕離開。Eclipse 會花一點時間尋找合適的版本。 在視窗中全選「 https://dl-ssl.google.com/android/eclipse/site.xml 」項目「Developer Tools」中的的選項後,按下右方的「Install」按鈕。 按下 「Next」 (下一步)鍵。照著步驟就安裝完成。安裝完會提示需重新啟動 Eclipse,按下 「Yes」 重新啟動。 Eclipse 3.3 版 找到螢幕上方的選單列, 選擇 「Help->Software Updates->Find and Install」 選項,這選項會帶出一個新視窗。 選擇 「Search for new features to install」 (搜尋新功能供安裝)選項,按下 「Next」 (下一步)鍵。出現設定畫面。 選擇右上角的 「New Remote Site」 (新增遠端網站)按鈕,會彈出一個 「New Update Site」 (新增更新網站)輸入框。 在輸入框中輸入擴充套件的名稱(Name) 「ADT」 跟網址(URL) 「http://dl-ssl.google.com/android/eclipse/site.xml 」,按下 「OK」 按鈕離開。 按下 「Finish」 按紐繼續下一步。Eclipse 會花一點時間尋找合適的版本。 接著我們要做的,就是等 Eclipse 顯示出選項時,勾選合適的版本安裝。 安裝完會提示需重新啟動 Eclipse,按下 「OK」 重新啟動。 離線安裝 已經安裝成功的讀者可以跳過這段。有些讀者因為網路環境的關係,無法順利地直接線上安裝 Android 開發工具。這時我們可以先前往http://developer.android.com/sdk/adt_download.html ,手動下載最新的開發工具版本來離線安裝。 下載完最新的ADT 擴充套件後,打開 Eclipse 開發環境,找到螢幕上方的選單列, 選擇 「Help->Software Updates」 選項,這選項會帶出一個新視窗。選擇「Available Software」標籤,選擇右方的 「Add Site...」 (新增網站)按鈕,會彈出一個輸入框。 選擇右上角的「Local...」按鈕,並選取剛下載的 Android 最新開發工具檔案,選到之後按下 "OK" 按鈕離開。 在視窗中全選新出現項目的所有選項後,按下右方的「Install」按鈕。Eclipse 會花一點時間開始安裝 ADT 擴充套件。 4. 下載 Android SDK 接著我們要從 http://developer.android.com/ Android 官方網站下載 「Android 軟體開發套件」 (Software Development Kit, SDK)。 下載下來的 SDK 檔案需要先解壓縮。Windows 平台需要先另行安裝解壓縮程式,如免費的 7-zip 解壓縮工具。 解壓縮後會出現一個資料夾。為了之後描述方便,我們將解壓縮後的 Android SDK 檔案夾命名為「android_sdk」。 5. 設定 Android SDK 打開偏好設定頁面(Preference),選擇 Android 標籤(請確認您已安裝好 ADT 擴充套件,Android 標籤才會出現在偏好設定頁面中),在 SDK Location 欄位按下 " Browse..."鍵,選擇剛剛解壓縮完的「android_sdk」檔案夾所在地,然後按下視窗右下角的套用(Apply) 按鈕。 這樣一來,Android SDK 就算是設定好啦。 註解:若您安裝過 SDK 1.5 版之前的版本,請先移除後再重新安裝一次 ADT 擴充套件,才能順利設定新版的 Android SDK。 方法是在螢幕上方的選單列,選擇「Help > Software Updates」選項,在彈出的視窗上方點選「Installed Software」頁籤,選擇「Android」開頭的選項,點選右側的「Uninstall..」按鈕移除這些相關的插件。 下一步 設定好 Android SDK 後,我們就擁有了一個完整的 Android 開發環境。 我們先來看看 Android SDK 中提供的一些範例,好了解 Android 到底能做些什麼。 ManageSDK 管理 SDK 管理 SDK 下載 SDK 組件 在選單上選擇「Window > Android SDK and AVD Manager」選項,開啟 Android SDK/AVD 管理工具。 在開啟的管理工具視窗中,切換到「Installed Packages」標籤頁,「Installed Packages」列表中預設只裝了「Android SDK Tools」,不包含目標 SDK。我們需要先自行安裝對應的 SDK 組件。 切換到「Available Packages」 標籤頁,開始裝目標 SDK。點選預設的網址,可以看到目前可用的目標 SDK、文件、Add-On,要完成本書中範例,只要勾選對應版本的目標 SDK、文件、Add-On,然後按下「Install Selected」按鈕即可。 在下一個視窗中可確認剛勾選預備要安裝的 SDK 組件。勾選「Accept All」選項後,按下「Install Accepted」按鈕即開始自動下載並安裝。 在安裝完成後,切換到「Installed Packages」標籤頁,可以看到剛剛勾選的 SDK 組件都已經安裝到開發環境中。 刪除 SDK 組件 經過幾次 Android 版本升級後,我們的列表中可能會包含許多舊版本的 SDK。這時可以透過選取列表中的組件,點選下方的「Delete...」按鈕來刪除這些過時的組件。我們隨時還可以回到管理工具的「Available Packages」標籤頁,把組件下載回來。 安裝好 SDK 組件後,我們就可以開始來熟悉開發環境了。 OpenProject 開啟現有專案 開啟專案 我們回到 Eclipse 環境來。在螢幕上方的選單列上,選擇「File->New->Project」,會彈出「New Project」對話視窗。 Eclipse 是通用的編輯環境,可根據你所安裝的不同擴充套件而支援許多種類的專案。 點擊 「Android」 資料夾下的「Android Project」,會開啟「New Android Project」對話視窗。 我們將開啟「SDK 組件」中提供的 ApiDemos 範例。在「New Android Project」對話視窗中,點選 "Browse..."按鈕以選擇「開啟已經存在的專案」(Create project from existing source)。我們在此選擇位於「android_sdk/platforms/android-2.0/samples」目錄中的 Android 應用程式專案 (android_sdk/platforms/android-2.0/samples/ApiDemos)。 當我們選擇了現存的範例程式專案時,「New Android Project」對話視窗中的諸如專案名稱(Project Name)與屬性等內容都將被自動填寫好。這時我們可以按下 「Finish」按鈕,完成從現存專案新增專案到 Eclipse 環境的動作。 匯入專案 如果你的程式專案已位於工作環境(WorkSpace)資料夾下,想使用上述方法開啟專案時,會得到欲開啟的資料夾已在工作目錄下的警告。因此我們得用另一個方法:匯入專案。 在螢幕上方的選單列上,選擇「File->Import」選項,會跳出「Import」視窗。選擇「General->Existing Projects into WorkSpace」項目,然後按下「Next」按鈕帶到新一個畫面。在「Select Root Directory」欄位旁,按下右方的「Browse...」按鈕,選擇對應的專案。選擇好後,按下「Finish」按鈕完成從現存在工作環境(WorkSpace)資料夾下的專案匯入到 Eclipse 環境的動作。 不同 SDK 版本的範例專案會放在「android_sdk/platforms/android-版本/samples」目錄中,請自行根據要開發的版本來選擇範例。 修復專案 完成新增程式專案到 Eclipse 後,我們可以在左側的「Package Explorer」中找到我們新增的專案。 如果發現開啟後的資料夾圖示上有個小小的黃色驚嘆號,表示這個專案匯入後還有些問題,我們可以使用ADT內建的功能來試著修復專案屬性。 在「Package Explorer」的 「ApiDemos」 專案檔案夾圖示上點選右鍵,從「Android Tools」選單中選擇「修復專案屬性」(Fix Project Properties)。 (Android Tools->Fix Project Properties) 如果發現開啟後的資料夾圖示上有個小小的紅色叉號,表示這個專案開啟/匯入後遇到了無法編譯的問題。最常見的也是與無法正常生成「gen」目錄相關的問題。一般簡單的解決方式是打開專案中任一 XML 檔案(如AndroidManifest.xml 或是「res」目錄下附檔名為 .xml 的檔案),改變一下內容(如在檔案中多按一個空格)後存檔,這時開發工具會自動編譯生成「gen」目錄中新的內容。這樣無法編譯的問題往往就解決了。如何修改 XML 檔案在後面章節中會提到。 切換 SDK 版本 Android 在 SDK 1.5 版之後引入了支援多個版本 SDK 與模擬器的新特性,讓我們得以透過修改屬性設定畫面的設定,來切換用來編譯與運行這些專案的目標 SDK 版本。 在「Navigator」的「ApiDemos」專案檔案夾圖示上點選右鍵,選擇「properties」選項,會開啟專案屬性設定畫面。 在設定畫面中先選擇左方的 Android 標籤,選擇後會出現可勾選的「Project Build Target」選單。 在選單中選擇適當的目標版本,選擇好之後按下 OK 結束設定畫面,這時專案就已經切換成可使用目標版本編譯的狀態了。 PlayEmulator 操作 Android 虛擬機器 使用 Android 虛擬機器 我們已經透過「Eclipse」開發環境,開啟了「ApiDemos」專案。本章將講解如何設定和操作 Android 虛擬機器。 設定 Android 虛擬機器 現在我們還不忙著開始寫程式,先花點時間,來看看怎麼在開發環境中,透過「Android 虛擬機器」來執行應用程式吧。 由於在剛開始開發時,我們手邊並不一定已擁有 Android 設備。因此 Android 開發工具亦提供了相當強大的模擬器,能讓我們自由配置,模擬各種硬體規格的設備。在 Android 中一律把 Android 模擬器稱作「Android 虛擬機器」(Android Virtual Device),簡寫為「AVD」。 「Android 軟體開發套件」(SDK) 1.5 以上的版本提供了支援不同目標版本虛擬機器的功能,在使用虛擬機器之前,必須先建立一個虛擬機器後才可在 Eclipse 開發環境中使用。 SDK 中提供了一個「android」命令行工具(在 android-sdk/tools 中),可以用來建立新專案或是管理虛擬機器。在此我們使用「android」命令行工具來新建立一個虛擬機器。 列出虛擬機器類型 首先,把「android-sdk/tools 」目錄加入系統路徑,我們以後就可以在任何地方使用「android-sdk/tools 」目錄下的各種命令。 在 Windows 2000、XP、2003、Windows 7 這些作業系統裡,點選「控制台 > 系統 > 進階 > 環境變數」。在「系統變數(S)」欄中,選取「PATH」變數名稱後,再點選「編輯(I)」按鈕。 再此假設您安裝 Android SDK 的路徑是「C:\android-sdk\tools」,接著在彈出的視窗中將「;C:\android-sdk\tools」(注意要以分號隔開)這字串添在原本的字串之後,按下確定後重新啟動作業系統。 重開系統後選擇「開始 > 執行」,在彈出的輸入框中輸入「cmd」,即可開啟命令行工具並繼續以下的動作。 或是您也可以直接打開命令行,進入「android-sdk/tools 」目錄,輸入以下命令: $ android list targets 在沒有將 Android SDK 加入路徑的情況下,在 Linux 或 Mac 環境中要輸入 $ ./android list targets 螢幕上會列出所有支援的虛擬機器類型 $ android list targets Available Android targets: id: 1 Name: Android 1.1 Type: Platform API level: 2 Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P id: 2 Name: Android 1.5 Type: Platform API level: 3 Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P id: 3 Name: Google APIs Type: Add-On Vendor: Google Inc. Description: Android + Google APIs Based on Android 1.5 (API level 3) Libraries: * com.google.android.maps (maps.jar) API for Google Maps Skins: HVGA (default), HVGA-L, QVGA-P, HVGA-P, QVGA-L 在這邊列出了三種虛擬機器類型。分別是編號(id)為 1、2 的 Android 1.1、1.5 虛擬機器,與編號(id)為 3 的「Google APIs」,Google 把自己提供的應用程式(如 Google Map)放在「Google APIs」這個虛擬機器類型中,因此要開發 Google Map 等 Google 專屬應用程式時,就必須先建立編號 3 這類型的虛擬機器,稍後才能在適當的虛擬機器上作驗證。 建立虛擬機器 我們現在來建立一個基本的 Android SDK 2.0 虛擬機器。 在命令行中輸入以下命令: $ android create avd --target 1 --name eclair 這段命令的意思是:使用「android create avd」命令來建立一個新的虛擬機器,「 --target 1」參數的意思是這個虛擬機器使用 id 為 1 的 SDK 套件(Android 1.5),「--name eclair」參數的意思是將這個建立的虛擬機器命名為「eclair」。 產生的結果如下 $ android create avd --target 1 --name eclair Android 2.0 is a basic Android platform. Do you wish to create a custom hardware profile [no] Created AVD 'cupcake' based on Android 2.0 列出已建立的虛擬機器 我們可以使用 「Android」命令行工具提供的「list avd」命令,來列出所有我們已經建立的模擬器。 在命令行中輸入以下命令: $ android list avd 產生的結果如下: $ android list avd Available Android Virtual Devices: Name: eclair Path: /Users/mac/.android/avd/cupcake.avd Target: Android 2.0 (API level 5) Skin: HVGA 使用「 android list avd」命令看到有輸出,即表示已成功建立虛擬機器,可以回到 Eclipse 環境來,設定執行應用程式專案所需的環境參數了。 設定環境參數 要執行 ApiDemos 程式前,我們得在開發環境中,事先設定好一些用來執行 ApiDemos 程式的環境參數。 以後使用其他程式專案時,我們也能用同樣的方式,讓這些程式在我們的開發環境中運行。 首先,我們透過選單列上的「Run」(執行)選單,選擇「開啟執行參數設定」(Run-> Debug Configurations...) 進入運行環境參數設定畫面。 進入設定畫面後,在視窗左側會有一整排 Eclipse 支援的運行設定,我們從中找到 "Android Application"(Android 應用程式)項目,按下滑鼠右鍵,點選 "New"(新增)選項。 選擇 「New」 選項後,在「Android Application」項目下方會多出一筆執行項目。 我們可以在 Name 欄位上輸入一個代表這個環境參數的名稱,在此我們輸入與專案名稱相同的「ApiDemos」。 在「Project」欄位右方,點選「Browse...」按鈕,開啟「專案選擇」(Project Selection)視窗,選擇「ApiDemos」專案並點選「OK」按鈕,以選擇要執行的專案。 在 「Launch Action」 選單中,確認預設選擇的是「Launch Default Activity」。 至此我們就完成了模擬器環境參數的設定。 點選右下角的「Debug」按鈕,Eclipse 就會啟動 Android 虛擬機器。 小技巧: 在選單列中,也可以選擇設定「Run Configuration...」選項。這時我們得到的是一個幾乎完全相同的環境參數設定畫面,只是右下角的「Debug」按鈕變成了「Run」按鈕。「Debug」與「Run」模式的環境參數設定可以共用,差別在於「Debug」模式下可以使用在之後章節中會介紹的 logd,來顯示一些開發時所需的額外訊息。 再次啟動 Android 虛擬機器 當我們設定好之後,以後碰到要再次啟動虛擬機器的情況時,只要在螢幕左上角的「Debug」或「Run」圖示右側小箭頭上按一下,從彈出的選單中選擇剛剛設定的環境參數名稱,虛擬機器即開始執行,並安裝好我們所指定的專案應用程式。 操作虛擬機器 改變虛擬機器外觀 在建立虛擬機器的時候,我們可以透過「skin」欄位來選擇預設的虛擬機器外觀。「skin」欄位中會列出目標(Target)版本支援的所有外觀。「HVGA」(解析度 480x320)、「QVGA」(解析度 320x240)等分別代表著各種不同畫面的解析度 在命令列上執行「android list targets」命令後,我們可以看到螢幕上列出所有支援的模擬器類型。舉我們剛才建立過的(id 1)虛擬機器為例,列出訊息如下: id: 1 Name: Android 2.0 Type: Platform API level: 5 Skins: HVGA (default), QVGA, WQVGA400, WQVGA432, WVGA800, WVGA854 其中 Skins 欄位中會列出所有支援的模擬器佈景,預設有多種畫面配置選項可選擇。 要建立「QVGA」模式的模擬器,則在前一節「android create avd」命令後,附加上「--skin QVGA」選項即可。要將預設的「HVGA 直式」顯示改為橫式,則可以透過使用快速鍵,直接切換螢幕來達成。 切換螢幕方向 在 Windows 作業系統上按下 「Ctrl」和「F12」鍵 ,或是在 Mac OS X 作業系統上同時按下「fn」 和「7」鍵,螢幕就會從預設的直式顯示改成橫式顯示,再按一次則切換回原來的直式顯示。 移除程式 我們已經順利地啟動了虛擬機器,那麼,該怎麼移除安裝到虛擬機器上的程式哩? Android SDK 中提供一個 adb (Android Debugger) 命令行工具 (在 android-sdk/tools 中),我們可以用裡面的 shell 工具連上虛擬機器來移除應用程式。在某些平台上,這些動作可能需要擁有 root 權限才能執行。 首先打開命令列,啟動 adb shell $ adb shell 接著切換到 data/app 目錄中 $ cd data/app/ 使用 ls 命令(等同 windows 上命令行的 dir 命令)來檢視檔案列表 # ls com.example.android.apis.apk 接著使用 rm 命令來刪除 ApiDemos 應用程式 # rm com.example.android.apis.apk # ls 移除虛擬機器 我們可以使用「android list avd」命令來列出所有的虛擬機器 $ android list avd Available Android Virtual Devices: Name: eclair Path: /Users/mac/.android/avd/cupcake.avd Target: Android 2.0 (API level 5) Skin: HVGA 表示現在系統中有一個名為 eclair 的虛擬機器。 我們可以使用「android delete avd --name eclair」命令來刪除名稱為「eclair」的虛擬機器。 $ android delete avd --name eclair AVD 'eclair' deleted. 刪除後再次執行「android list avd」命令,得到的結果為 $ android list avd Available Android Virtual Devices: 表示系統中已經不存在任何模擬器,我們真的已經將虛擬機器刪除了。 ReadSource 建立一個 Android 程式 在前幾章我們已經學到怎麼開啟現有的專案,也導覽過了整個模擬器的設定流程。 現在我們從設計一個簡單實用的身高體重指數計算(BMI)應用程式開始,學習設計一個 Android 應用程式所需的基礎。 維基百科上這麼介紹 BMI 身高體重指數: 身高體重指數(又稱身體質量指數,英文為Body Mass Index,簡稱BMI)是一個計算值。 ...當我們需要比較及分析一個人的體重對於不同高度的人所帶來的健康影響時, BMI值是一個中立而可靠的指標。 簡而言之,我們要設計的程式就是允許輸入身高體重,按下「計算 BMI」鍵後就在螢幕上顯示 BMI 值,並彈出「你應該節食囉」、或「你應該多吃點」...等健康建議。健康建議的判斷: 只要 BMI 值超過 「25」 時就算偏胖、BMI 值低於 「20」 就算偏瘦。 判斷寫得很簡單。畢竟我們要學習的關鍵知識,不是在於 BMI 值的算法或健康建議的內容,而是在於 Android 程式的運作方式。 參考資源 http://zh.wikipedia.org/wiki/身高體重指數 我們這就先從建立一個新的程式專案開始吧。 建立新程式專案 首先,我們照前面章節的教學,建立一個新的程式專案。並將新專案名稱命名為 BMI。 在「內容」欄裡,我們選擇「在工作區域中建立新專案」(Create new project in workspace)。 這時,如果在"選擇欄"取消掉勾選「使用預設目錄」(Use default location) 選項,我們就可以切換儲存專案的資料夾。 大部分的時候我們並不需去改動這個選項,而是直接使用預設的資料夾。 前面章節中都是開啟現有的專案,因此那些專案屬性 (Properties) 等內容都被自動填寫好了。這章中要從無到有新建一個專案,因此我們必須自行填寫專案相關的屬性。 在此對"New Android Project" 對話框中出現的這些欄位作些簡單的說明: 名稱 描述 Project Name 包含這個項目的資料夾的名稱 Application Name 顯示在應用程式上的標題 Package Name 套件(Package)名稱,JAVA 的習慣是用套件名稱來區分不同的類別(class)。依照專案的不同,我們會起不同的路徑名稱。 Create Activity 使否建立這個是項目的主要類別,勾選後可以指定這個類別的名稱。這個類別是一個 Activity 類別的子類別。我們可以在「Activity」中啟動程式和控制程式流程,或是根據需要控制螢幕、界面。 Build Target 選擇用來編譯專案的 SDK 版本。 當選定了 Build Target 後,開發工具會在 Min SDK Version 欄位中自動填入對應的值 Min SDK Version 本應用程式所支援的最低 SDK 版本代號。 我們在欄位中分別填入以下的值: 名稱 值 Project Name BMI Application Name BMI Package Name com.demo.android.bmi Create Activity Bmi Min SDK Version 5(自動填入) 填好值後按下「Finish」 按鈕,就建立好新專案了。 注意 Package Name 的設定,必須至少由兩個部分所構成,例如:com.android。「Activity Name」是指定用來產生預設 java 程式碼的文件名稱,與文件中預設 Activity 類別 (class) 的名稱。依照 java 語言的命名習慣,「Activity Name」最好採用開頭大寫的形式。 回到 Eclipse 主畫面,我們注意到在左側 Package Explorer 視窗中已順利新增加了一個 BMI 目錄。 程式專案架構 乍看之下,Android 插件已幫我們建立了不少檔案。 檢視新建立的 BMI 檔案夾中的內容,我們可以將一個 Android 應用程式基本的檔案結構歸納成如下: 我們來看看 Android 應用程式的基本檔案結構,以及各自所負責的內容。 src/ 原始碼(source)目錄 src 目錄中包含了一個 Android 應用程式中所需的各個程式碼檔案。這些檔案被包在對應 package 的子目錄下。(如本章的 BMI 例子中,子目錄指的就是 /src/com/demo/android/bmi/) src 目錄中比較關鍵的程式有: 1. Bmi.java 這個檔案的檔名會隨著你在建立一個新的程式專案畫面中所填入「Create Activity」欄位值的不同而改變。這是新程式專案中的主要程式區塊。我們開發 Android 程式的多數時間,都是在 src 目錄下和 Android 打交道。 gen/ 自動生成(Generate)目錄 gen 目錄中存放所有自動生成的檔案。 gen 目錄中最關鍵的程式就是 R.java 檔。 1. R.java 這個檔是自動產生的。會由 ADT 插件自動根據你放入 res 目錄的 XML 描述文件、圖像等資源,同步更新修改 'R.java' 這個中介檔案。所有的 Android 程式中都會有以 R.java 為名的這個檔案,你完全不需要,也應避免手工修改 R.java 這個檔案。 R.java 中自動產生的 「R」 類別就像是個字典一樣,包含了使用者介面、圖像、字串等各式的資源與相應的編號(id)。Android 應用程式中很多時候會需要透過 R 類別調用資源。 編譯時編譯器也會查看這個資源列表,沒有使用到的資源就不會編譯進去,為手機應用程式節省不必要佔用的空間。 res/ 資源(Resource)目錄 「res」 目錄中存放所有程式中用到的資源檔案。"資源檔案"指的是資料檔案,或編譯時會被轉換成程式一部分的 XML 描述檔。Android 針對放在 「res」 目錄下的不同子目錄的資源,會有各自不同處理方式。因此我們寫程式時,最好能搞清楚各目錄下分別可放置的內容。 res/ 中的程式: 3. layout/ 版面配置(layout)目錄 「layout」目錄包含所有使用 XML 格式的介面描述檔。「layout」 中的 XML 介面描述檔就像寫網頁時用到的 HTML 檔案一樣,用來描述螢幕上的版面編排與使用的介面元件。XML 介面描述檔描述的內容可以是整張螢幕,也可以只描述一部分的介面(例如描述用來產生對話框的介面元件)。 雖然你也能直接通過 Java 來建立使用者介面,不過透過 XML 描述檔來建立使用者介面相對更簡單,架構也更清晰,以後維護時更容易釐清問題。要使用這些介面元件,應透過 「R.java」 檔中自動產生的 「R」 類別來調用。 4. values/ 參數值(value)目錄 「values」 目錄包含所有使用 XML 格式的參數值描述檔,可以在此添加一些額外的資源如字串(很常用)、顏色、風格等。使用時也是透過 「R」 類別來調用。 Android 功能清單 5. AndroidManifest.xml 「AndroidManifest.xml」 是 Android 程式的功能清單,應用程式在這裡列出該程式所提供的功能。當應用程式開啟時,會提供諸如內容提供者(ContentProvider)、處理的資料類型、實際運行的類別、跨應用程式的資訊等等訊息。 你可以在此指定你的應用程式會使用到的服務(諸如電話功能、網路功能、GPS功能等)。 當你新增一個頁面行為類別 (Activity) 時,你也需要先在此註冊這個新增的 Activity 類別後,才能順利調用。 AndroidUI 描述使用者介面 將一份創意落實到可執行的應用程式,背後需要的是從閱讀與寫作程式碼中累積的經驗,並有堅持理念、直到完成的耐心。 表達使用者介面 我們可以先用前幾章教的方法設定並執行模擬器,看看模擬器運作後的結果。 我們看到一個文字欄位,上面有一串文字 「Hello World, Bmi!」。這就是 Android 預設程式架構的範例囉。 由於才剛開始實際接觸到 Android 應用程式,我們先從簡單的開始:這一節中,我們的目標是將 「Hello World, Bmi!」 換成別的文字。 那麼,「Hello World, Bmi!」,這串字串藏在哪裡呢? 先打開 「res/layout/main.xml」 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 <TextView 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:text="@string/hello" 11 /> 12 </LinearLayout> 原來「Hello World, Bmi!」字串就藏在「res/layout/main.xml」這個檔案的第 10 行中。我們只要簡單地將第 10 行修改成如下 android:text="Hello World, Bmi!” 再執行一次模擬器,就可以得到一個相似的應用程式,只是內文變成了我們剛剛修改的內容。 既然找到了「Hello World, Bmi!」字串,我們就試著將「android:text」屬性值從「Hello World, Bmi!」改成「哈囉,BMI」,然後執行看看吧。 android:text="哈囉,BMI" 結果發現 Android 模擬器中文嘛也通,字型也相當漂亮。 要開始學習 Android 應用程式確實很簡單吧?不過為了顯示「Hello World, Bmi」,也用到了許多程式碼。到底這些程式碼有什麼含意呢? 我們馬上來學習 「main.xml」這個 XML 介面描述檔的內涵吧。 Android 平台裡,使用者介面都是透過 ViewGroup 或 View 類別來顯示。ViewGroup 和 View 是 Android 平台上最基本的使用者介面表達單元。我們可以透過程式直接呼叫的方法,調用描繪使用者介面,將螢幕上顯示的介面元素,與構成應用程式主體的程式邏輯,混合在一起編寫。或是,也可以將介面顯示與程式邏輯分離,照著 Android 提供的這個較優雅的方式,使用 XML 描述檔,來描述介面元件的組織。 講解 我們看到的「Hello World, Bmi」就包含在「main.xml」 這個檔案中。 接著,我們就直接分部份來講解這個「main.xml」 檔案裡的內容: 第 1 行 <?xml version="1.0" encoding="utf-8"?> XML (Extensible Markup Language) 是一種標記描述語言,不管是語法還是看起來的樣子,都相當類似網頁所使用的 HTML 標記語言。XML 被廣泛地運用在 Java 程式的設定中。「main.xml」 文件裡,第一行是每個 XML 描述檔固定的開頭內容,用來指示這個文字檔案是以 XML格式描述的。 第 2, 6 與 12 行 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"></LinearLayout> 接著我們看到第一個標籤,與 HTML 網頁標籤相當類似。 <LinearLayout></LinearLayout> "線性版面配置"(LinearLayout)標籤,使用了兩個「LinearLayout」標籤,來表示一個介面元件的區塊。後頭的標籤前加上一個「/」符號來表示結束標籤。"線性版面配置" 所指的是包含在 「LinearLayout」 標籤中,所有元件的配置方式,是將一個接一個元件由上而下排隊排下來的意思。 xmlns:android="http://schemas.android.com/apk/res/android" xmlns 開頭的這串敘述,是用來宣告這個 XML 描述檔案的的名稱空間(NameSpace),後面接的URL(網址),表示這個描述檔案會參照到 Android 名稱空間提供的定義。 所有 Android 版面配置檔案的最外層標籤中,都必須包含這個屬性。 注意標籤需要兩兩對稱。一個標籤「 <linearlayout> 」在一串敘述的前頭,另一個標籤「 </linearlayout> 」在敘述的末尾。 如果你修改過的標籤沒有閉合(忘了加 <、/、> 等符號),Eclipse 畫面上也會出現小小的警示符號來提醒你。 第 3-5 行 android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" 這些包含在「 <linearlayout> 」標籤中的敘述被稱為「LinearLayout」標籤的「屬性」。Android 應用程式在 layout 目錄中的標籤,大多數的屬性前都有一個「android:」前綴。同一個介面元件的屬性之間,是以空白做區隔,因此事實上你也能將多個屬性寫在同一行。當然,將屬性排成多行更易於閱讀。我們應該保持這個好習慣。 介面元件都有許多共同的屬性,例如介面元件的長,寬度設定屬性。Android 介面元件的寬度、長度設定屬性分別叫做「android:layout_width」、「android:layout_height」。兩個都設定為 「fill_parent」參數值。「fill_parent」 如其名,所表達的的意思就是"填滿整個上層元件"。預設 LinearLayout 介面元件就會佔滿整個螢幕空間。 介面元件彼此間也會有一些不同的屬性,例如 「LinearLayout」(線性版面配置) 標籤的「android:orientation」(版面走向) 屬性。在此填入 「vertical」 (垂直)屬性值,表示這個介面的版面配置方式是從上而下垂直地排列其內含的介面元件。 「android.view.ViewGroup」 是各種佈局配置(layout)和視圖(View)元件的基礎類別。常見的實現有 LinearLayout(線性版面配置)、FrameLayout(框架版面配置)、TableLayout(表格版面配置)、AbsoluteLayout(絕對位置版面配置)、RelativeLayout(相對位置版面配置)等。 雖然有這麼多種版面配置方式可以選用,但大多數的應用程式並不需特地去改變預設的 LinearLayout 的配置,只要專注在其中填入需要的介面元件即可。所以從第 7 行之後的內容才是一般應用程式開發時較常修改之處。 第 7 和 11 行 <TextView /> TextView (文字檢視)是我們看到的第一個熟悉的介面元件。其作用是顯示文字到螢幕上。你可能注意到這個標籤結尾使用了 「/>」 符號。 「/>」符號表示這個XML敘述中沒有內文,亦即此介面元件描述中不再包含其他介面元件,也表示這個介面元件就是這個螢幕中最小的組成單元了。 第 8-10 行 android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, bmi" 我們來看看 TextView 介面元件中包含了哪些屬性。 「android: layout_width」和「android:layout_height」我們剛剛已經學過了,分別代表寬度跟長度。「android: layout_width」 的 「fill_parent」 參數值表示寬度填滿整個上層介面元件(即 LinearLayout 介面元件)。「android:layout_height」則是用上一個新的參數值「wrap_content」(包住內容),亦即隨著文字欄位行數的不同而改變這個介面元件的高度。最後的 「android:text」 屬性則是 TextView 介面元件的主要屬性,亦即文字欄位中顯示的文字內容。至於「@string/hello 」這段字串所代表的意義,馬上會接著在後面章節說明。我們現在已知道是:只要將「android:text」屬性內容替換成我們想要文字,在預覽畫面或在模擬器中就會顯示對應的文字。 將以上的 XML 描述綜合起來,我們就可以得知「main.xml」 想表達的介面。 BmiUI 設計使用者介面 視圖(View) 軟體設計的過程中,常常會遇到需要頻繁修改使用者介面的情境。改著改著程式設計師們就累積起了一些經驗,也歸納出了許多應對之道。如著名的 MVC(Model-View-Controller) 模式。Google Android 為我們考慮了介面修改問題。Android 為了單純化介面修改方式,採用了目前比較流行的解決方案--即將介面描述部份的程式碼,抽取到程式外部的 XML 描述文件中。 我們在前面的過程裡已經學到,如何在 Android 應用程式中替換 TextView 介面元件所顯示的純文字內容。那麼...這個經驗能不能直接用到 BMI 應用程式的設計上呢? 我們先回過頭來想想, BMI 應用程式最少應該需要什麼些什麼元件。 為了輸入 BMI 程式所需的身高體重值,大致上我們需要兩個 TextView 元件用來提示填入身高體重數字,另外也需要兩個文字輸入欄位用來填入身高體重數字。我們還需要一個按鈕來開始計算,而計算完也需要一個 TextView 元件來顯示計算結果。於是初版的 BMI 應用程式介面的樣子就浮現出來了。 查閱文件 話說回來,我們從哪得知各種可用的介面元件呢?其中一個方法是查閱文件。 Android 文件網站上找到各種可用介面元件列表。 http://developer.android.com/guide/tutorials/views/index.html 例如我們想查看 EditText 的內容,我們可以點進 EditText 連結查看其內容。 http://developer.android.com/reference/android/widget/EditText.html 你會看到一個詳細地驚人的網頁。 這邊舉其中常用到的 EditText 介面元件為例。EditText 介面元件的作用就是提供一個文字輸入欄位。EditText 繼承自另一個叫 TextView 的介面元件,TextView 介面元件的作用是提供文字顯示,所以 EditText 介面元件也擁有所有 TextView 介面元件的特性。 此外,文件中你也可以查找到 EditText 欄位的一些特殊屬性,如 「android:numeric="integer"」(僅允許輸入整數數字)、「android:phoneNumber="true"」(僅允許輸入電話號碼),或「android:autoLink="all"」(自動將文字轉成超連結)。 例如要限制 EditText 中只允許輸入數字的話,我們可以在 XML 描述檔中,透過將 EditText 的參數「android:numeric」 指定為 「true」,以限制使用者只能在 EditText 文字欄位中輸入數字。 離線文件 當你處於沒有網路連接的情況下時,也可以找到 Android 文件參考。 在下載了 android-sdk 後,將之解壓縮,你可以在「android-sdk/docs」 目錄中 (android_sdk/docs/reference/view-gallery.html) ,找到一份與線上文件相同的文件參考。 開始設計 我們從實例來開始,定義一個基本 BMI 程式所需的身高(Height)輸入欄位,就會用到 EditText,與 TextView 介面元件,其描述如下: 1 <TextView 2 android:layout_width="fill_parent" 3 android:layout_height="wrap_content" 4 android:text="身高 (cm)" 5 /> 6 <EditText android:id="@+id/height" 7 android:layout_width="fill_parent" 8 android:layout_height="wrap_content" 9 android:numeric="integer" 10 android:text="" 11 /> 可以看到 EditText 介面元件描述的基本的組成與 TextView 介面元件相似,都用到了「android:layout_width」與「android:layout_height」屬性。 另外,指定的另外兩個屬性「android:numeric」、「android:text」則是 EditText 介面元件的特別屬性。「android:text」屬性是繼承自 TextView 介面元件的屬性。 android:numeric="integer" android:text="" 將 「android:numeric」 指定為 「integer」,可以限制使用者只能在 EditText 文字欄位中輸入整數數字。「android:text」屬性則是指定 EditText 介面元件預設顯示的文字(數字)。 我們再來看看 Button (按鈕)介面元件 <Button android:id="@+id/submit" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="計算 BMI 值" /> Button 介面元件同樣有 「android:layout_width」與「android:layout_height」屬性,另外一個「android:text」屬性則用來顯示按鈕上的文字。 整合 我們這就從文件中挑出我們需要的 TextView(文字檢視)、EditText(編輯文字)、Button(按鈕) 三種介面元件,照前面的設計擺進 LinearLayout (線性版面配置)元件中。 完整的「main.xml」介面描述檔如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="身高 (cm)" /> <EditText android:id="@+id/height" android:layout_width="fill_parent" android:layout_height="wrap_content" android:numeric="integer" android:text="" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="體重 (kg)" /> <EditText android:id="@+id/weight" android:layout_width="fill_parent" android:layout_height="wrap_content" android:numeric="integer" android:text="" /> <Button android:id="@+id/submit" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="計算 BMI 值" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <TextView android:id="@+id/suggest" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> </LinearLayout> 我們可以啟動模擬器檢視執行結果。或是在頁面標籤下選擇「Layout」標籤,來預覽頁面配置。 啟動模擬器之後,模擬器畫面上出現了兩個輸入欄位。欄位上方分別標示著「身高 (cm)」、「體重 (kg)」。在兩個輸入欄位下方,是一個標示著「計算 BMI 值」的按鈕。 當你在欄位中試著輸入文字或數字(你可以直接用電腦鍵盤輸入,或按著模擬器上的虛擬鍵盤輸入)時,你也會發現,正 XML 描述檔的描述中對兩個 EditText 欄位所規定的,欄位中只能輸入數字。 我們在上面XML描述檔中定義的最後兩個 TextView 介面元件,由於並未替這兩個介面元件指定「android:text」屬性,所以在螢幕上並未顯示。這兩個介面元件在後面章節中會派上用場。 革命的路還長 高興了沒多久,你發現按下"計算 BMI 值" 按鈕後,應用程式完全沒反應。 這是正常的,因為我們還沒處理從介面輸入取得身高體重、將數值導入 BMI 計算方式、將結果輸出到螢幕上...等等 BMI 應用程式的關鍵內容。 不過在進入了解程式流程之前,我們還有一個「android:id」屬性尚未解釋哩。 接著我們將透過講解「android:id」屬性,來進一步了解 Android UI。 視覺化的介面開發工具 目前的 ADT 版本提供了預覽介面的功能,但尚未提供方便地視覺化拖拉介面元件的開發工具。以後也許 ADT 會加入完整的 GUI 拖拉設計工具。 但在 ADT 加入完整的 GUI 拖拉設計工具之前,已經有人寫出來了對應 Android 的 GUI 拖拉設計工具,可供使用。 DroidDraw - Android GUI 拖拉設計工具 http://code.google.com/p/droiddraw/ XmlR 存取識別符號 在上一章談了 XML描述檔中介面元件的各種「android:」開頭的屬性。要使用一個介面元件,第一件事就是定義出介面描述檔。大部分的介面元件(如 LinearLayout、TextView)不需要在程式中作後續處理,因此可以直接描述(例如我們前面定義過的 TextView 文字顯示元件「身高(cm)」)。但對於那些將在程式中被參考(reference)到的介面元件(如按鈕 Button、文字輸入欄位 EditText),我們需要先行在 XML描述檔中,定義該介面元件的「android:id」識別符號屬性。這麼一來在程式碼中我們要操作這個介面元件(取出欄位中輸入的資料、取得按下按鈕事件...)時,就能透過「android:id」識別符號來調用這個介面元件。 <EditText android:id="@+id/height" /> 前面章節提過,寫作時最好將 XML 描述檔屬性分行列出,以易於閱讀(增加可讀性)。而我們的範例卻將 android:id 屬性直接擺在 EditText 標籤後。其實這麼做同樣是基於易於閱讀的考量。當然你也可以將「android:id」屬性分行列出,或是將「android:id」屬性放在屬性列表的中間或最後頭,這些作法都是允許的,本書中一律採用將 android:id 屬性直接擺在介面元件標籤後的寫法。 android:id 屬性的內容長得比較特別: @+id/height 「height」是這個介面元件的 android:id。以後的程式中會使用「R.id.height」來取得這個介面元件。「@+id」 的意思是我們可以通過這個識別符號來控制所對應的介面元件,「R」類別會自動配置一個位址給這個介面元件。 「R」類別的內容則可以透過查看 R.java 得知。 XML 描述檔與 R.java 檔 在 Android 系統中,我們使用 XML 來定義 UI。但是有些稍微有經驗的開發者可能會有疑問: 「用 XML 來描述介面固然方便,但是對於手機程式來說,直接用 XML 檔案是不是太占空間了?」。 沒錯,如果 Android 是直接使用 XML 來儲存介面描述到手機上的話,一定會佔用比起現在大的多的檔案空間。解決的方法是Android 並不直接使用 XML 檔案,而是透過 Android 開發工具,自動將 XML 描述檔轉換成資源檔案。一旦應用程式要操作某個介面元件,或是使用任何種類的資源(字串、圖片、圖示、音效...),都使用索引來查詢。 當你建立一個 BMI 新專案,打開位於 「gen/com/demo/android/bmi」 目錄下的 「R.java」檔,你可以看到如下的程式碼: /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ package com.demo.android.bmi; public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040000; } } 在照著前一章新增了 XML 描述後,再次打開打開 「gen/com/demo/android/bmi」 目錄下的 「R.java」 檔 ,你可以看到如下的程式碼: /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ package com.demo.android.bmi; public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; } public static final class id { public static final int height=0x7f050000; public static final int result=0x7f050003; public static final int submit=0x7f050002; public static final int suggest=0x7f050004; public static final int weight=0x7f050001; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040000; } } 我們看到在 R.java 檔案中,分別有 attr (屬性)、drawable (圖片、圖示)、id (識別符號)、layout (介面描述)、string (文字) 這幾種資源型態,就 XML 描述檔中的 id 來說,開發工具會根據 XML 描述檔中指定的 id,生成對應的資源,並自動指定一個位址。 Google 官方文件是這麼解釋「R.java」檔案的作用的: A project's R.java file is an index into all the resources defined in the file. You use this class in your source code as a sort of short-hand way to refer to resources you've included in your project. This is particularly powerful with the code-completion features of IDEs like Eclipse because it lets you quickly and interactively locate the specific reference you're looking for. The important thing to notice for now is the inner class named "layout", and its member field "main". The Eclipse plugin noticed that you added a new XML layout file and then regenerated this R.java file. As you add other resources to your projects you'll see R.java change to keep up. 有了「R.java」做中介,在 XML 描述檔中,我們可以透過 @[類型]/[識別符號] 這樣的語法來為某個介面元件提供識別符號,以供程式控制。 例如,我們可以用 「@+id/height」來為對應供輸入身高數字的 EditText 元件提供識別符號。 將字串抽離 XML 當我們在 res 資料夾中新增各種一個 XML 檔案,或是一張圖片時,開發工具會從 res 資料夾中蒐集,並將各種資源彙整成一個索引,自動產生出 R.java 檔。 透過這個特性,我們可以進一步加工我們的 XML 描述檔,讓介面更易於維護。 開啟 res/values/strings.xml 原始的內容為 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">BMI</string> </resources> 裡面只定義了一個字串「app_name」,用來表示應用程式名稱(在之後講解 AndroidManifest.xml 檔案時將會用到)。 我們看到表示字串的格式為 <string name="識別代號">文字敘述</string> 我們將上一章中的敘述抽取出來,整理進 strings.xml 檔案。 完整的 strings.xml 檔案如下: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">BMI</string> <string name="bmi_height">身高 (cm)</string> <string name="bmi_weight">體重 (kg)</string> <string name="bmi_btn">計算 BMI 值</string> <string name="bmi_result">你的 BMI 值是 </string> </resources> 在 strings.xml 檔案中,我們在原本的 app_name 字串外,自行定義了另外幾個字串。如果我們再次開啟 「R.java」檔,我們會發現檔案中的 string 類別中也自動索引了上面定義好的字串: public static final class string { public static final int app_name=0x7f040000; public static final int bmi_btn=0x7f040003; public static final int bmi_result=0x7f040004; public static final int bmi_height=0x7f040001; public static final int bmi_weight=0x7f040002; } 接著,我們把這些字串應用到之前定義好的 XML 描述檔中。透過使用 @string/[識別符號] 這樣存取 string 類型的格式,來取代 main.xml 檔案中原本寫死的文字敘述。 完整的程式碼如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/bmi_height" /> <EditText android:id="@+id/height" android:layout_width="fill_parent" android:layout_height="wrap_content" android:numeric="integer" android:text="" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/bmi_weight" /> <EditText android:id="@+id/weight" android:layout_width="fill_parent" android:layout_height="wrap_content" android:numeric="integer" android:text="" /> <Button android:id="@+id/submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bmi_btn" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <TextView android:id="@+id/suggest" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> </LinearLayout> 再次運行 Android 虛擬機器,我們看到與前一節完全相同的介面。但就介面而言,透過將描述字串統一集中在 「string.xml」 中,我們以後要修改介面時更有彈性了。 至此我們已經完成了 BMI 應用程式負責「顯示 (View)」的部份。 新增 XML 檔案 我們在前面都只修改到開發工具幫我們產生的檔案, 而事實上,我們所有在 「res」 目錄中所做的修改,開發工具都會自動搜尋,將之整理到「R.java」中。因此我們也可以在「src/values」中建立自己的文字描述檔案。 我們這就在「res/values」目錄中建立一個 「advice.xml」檔,裡面將包含 BMI 程式算出 BMI 值後將給予的建議文字,完整的檔案如下: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="advice_light">你該多吃點</string> <string name="advice_average">體型很棒喔</string> <string name="advice_heavy">你該節食了</string> </resources> 打開「R.java」檔,我們發現「advice_light」、「advice_average」、「advice_heavy」也已整理進「R.java」檔的索引中,以供程式調用。 Android 中所有的資源檔案(圖片、XML等)命名都必須使用英文小寫,檔名中間只允許加上底線「」符號。其他的檔名都會造成無法正常產生R.java 檔,讓你的程式無法編譯。 那麼接下來,我們就開始進入到了解 Android 程式流程的部分吧。 AndroidLogic 解讀程式流程 接著要觀察主要程式邏輯的內容囉。打開 「src/com/demo/android/bmi」 目錄下的 「Bmi.java」檔案,Eclipse+Android 開發工具已經幫我們預先建立好了基本的程式邏輯。其預設的內容如下: 1 package com.demo.android.bmi; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 6 public class Bmi extends Activity { 7 /** Called when the activity is first created. */ 8 @Override 9 public void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.main); 12 } 13 } 講解 比起什麼標籤都對稱的 XML 介面描述檔來說,這個以 Java 程式語言寫成的檔案雖然篇幅短,但反而要難讀得多。 我們將程式直接拆開,分成幾個部份來講解這個「Bmi.java」 檔案的內容: 第 1 行: package com.demo.android.bmi; 這一行的作用是指出這個檔案所在的名稱空間。「package」(套件)是其關鍵字。使用名稱空間的原因是程式一旦擴展到擴展到某個大小,程式中的變數名稱、方法名稱、類別名稱難免重複, 這時就可以將定義的名稱區隔管理在 package 下,以避免相互衝突的情形發生。Java 的 package 設計成與檔案系統結構相對應,如我們的 package 設定是 「package com.demo.android.bmi」,則這個類別就該在指定目錄的「com/demo/android/bmi」路徑下可以找到。 同時也別忘了 Java 程式語言每段敘述語句的結尾處,與大部分的程式語言一樣需加上一個分號「;」,以表示一行程式敘述的結束。 第 3,4 行: import android.app.Activity; import android.os.Bundle; 程式中預設導入了 「android.app.Activity」跟「android.os.Bundle」兩個 Package,在所有的 Android 應用程式中都會用到這兩個 Package。「import」(導入)是用作導入 Package 的關鍵字。在 Java 語言中,使用到任何 API 前都要事先導入相對應的 Package。我們馬上將學到這兩個 Package 的用途。 Android 支援的 Package 與標準的 Java(j2se) 不盡相同。在寫 Android 應用程式時,你偶而可能需要參考可用的 API 列表,以確認使用到的 Package 是否有內建支援。後續章節中也將講解如何透過新增「jar」檔來呼叫額外的 Package。 完整的 API 可查閱官方的 package 列表: http://code.google.com/android/reference/packages.html 第 6,13 行: public class Bmi extends Activity { } 第6行開始了程式的主體。其組成是這樣的: public class Bmi 「Bmi」是這個類別的名稱。「class」則是用作宣告類別關鍵字。「public」關鍵字是用來修飾「Bmi」這個類別。表示「Bmi」是個「公開」的類別,可以從 package 外部取用。 「public class Bmi」後面再加上「extends Activity」敘述,則表示 「Bmi」 這個類別的功能、型別等全繼承自「Activity」類別。「extends」是繼承(Inherit)類別的關鍵字。「Activity」是來自於我們在第3行剛導入的Package。 因此整句話的含意即:「宣告一個公開的 Bmi 類別。這個 Bmi 類別繼承了程式開頭導入的 Activity 類別」。 「{}」大括號規範了一個程式區塊。大括號中的程式表達的這個程式區塊的主要內容。 第 7 行: /** Called when the activity is first created. */ 第 7 行提供了位於其下的函式的註釋。「/* */」 是 Java 語言的多行註解符號,位於其中的文字內容不會被編譯。「/*」敘述後多出來的一個「*」號被視為內文。順便提醒一下,Java 程式語言中兩個斜線「//」表示的是單行註解符號。單行註解符號「//」與多行註解符號「/* */」不同的地方是,只有與「//」符號同行的文字才不會被編譯。 第 8-9, 12 行: @Override public void onCreate(Bundle savedInstanceState) { } 第9行開始了這個方法(Method)的主體。其組成是這樣的: public void onCreate(Bundle savedInstanceState) { } 「onCreate」是這個方法的名稱。「void」則是宣告了這個方法的回傳值的型別(type)。「public」關鍵字是用來修飾「onCreate」這個方法。表示「onCreate」是個「公開」的方法,可以由 bmi 類別外部取用。 方法的回傳值的型別,即是這個方法的型別。「onCreate」這個方法使用「void」型別,表示「onCreate」這個方法不需回傳值。 同時,這個方法傳入了一個名為「savedInstanceState」的「Bundle」型別參數,「Bundle」型別正是來自我們前面所導入的 Package 之一。我們並不需要知道太多「Bundle」型別或「savedInstanceState」實體的細節,只要知道「Bundle」的內容與手機平台的記憶體管理有關。 當 Android 應用程式啟動、換到背景等待、關閉時,都會用到 「savedInstanceState」 這個實體來處理記憶體相關的事宜。當然,你也可以用其他名稱來代替它。還好「onCreate」這個方法永遠都是傳入「Bundle savedInstanceState」這個參數,寫應用程式時只要正確照規定傳入即可,你可以不用太去在意它。 給對 Bundle 是什麼有興趣的讀者: 「Bundle」可以保存程式上一次關閉(凍結)時的狀態。你可以透過覆寫 onFreeze 方法(與 onCreate 方法的作用類似) 來保存凍結前的狀態。 當程式啟動(Activity 重新初始化)時,會再次呼叫 onCreate 方法,你就能從 savedInstanceState 中得到前一次凍結的狀態。我們也可以透過「Bundle」來將這個 Activity 的內容傳到下一個 Activity 中。 之後講 Activity 時,也會講解 onCreate/onFreeze 等方法的關係。 「{}」大括號規範了一個程式區塊。大括號中的程式表達 onCreate 這個程式區塊的主要內容。 @Override public void onCreate(Bundle savedInstanceState) 從前面的講解中,我們學到了在任何一個 Android 專案目錄裡,只要打開「Referenced Libraries」 目錄的「android.app」 分類,都可以找到 「Activity.class」這個類別。現在我們再深入一些查看「Activity.class」 類別。你要做的,只是依照圖示,找到 Android 工具中的「Referenced Libraries」 目錄,從「android.app」 分類裡找到「Activity.class」類別,並按下「Activity.class」 類別左側的三角形圖示,如此即可展開這個類別的屬性/方法列表。 我們在Activity類別的屬性/方法列表中,發現了現在正要講解的 onCreate 方法(Method)。 因為「bmi」 類別繼承自 Activity 類別,所以預設「bmi」 類別中其實已經有「onCreate」方法了。 事實上,「onCreate」 方法正是每個 Activity 類別初始化時都會去呼叫的方法。「@」開頭的語句表示裝飾子(decorator)語句,「@Override」語句的作用是告訴程式我們要覆寫這個「onCreate」方法。當我們打開程式時,程式不再使用從「bmi」 類別中繼承來的「onCreate」方法,而是使用我們在程式中自訂的行為。 @Override public void onCreate(Bundle savedInstanceState) { } 我們講解了整段程式,其含意是「覆寫 bmi 類別中公開的 onCreate 方法。這個 「onCreate」 方法無回傳值型別,而且這個方法傳入了一個名為 「savedInstanceState」 的 Bundle 型別參數。 現在來看看「onCreate」方法中包含的程式內容。 第 10, 11 行: super.onCreate(savedInstanceState); 「super」是關鍵字。代表著這個 「Bmi」 類別的上層類別(Activity)。「super.onCreate(savedInstanceState);」的意思就是:「執行 Activity 類別中 onCreate 方法的內容」。這麼做的目的是什麼呢? Google Android 將其應用程式的介面稱為視圖(View),而負責控制各種動作行為的程式主體(Controller),則稱為活動(Activity)。因此一個 Android 應用程式,必定會對應到一個以上的 Activity。 「onCreate」 方法則是每個 Activity 類別初始化時都會去呼叫的方法。我們想做的事,是保持原本「onCreate」 方法預設的動作,然後在其中加入我們想要的內容。 而 Android 產生的程式預設卻覆載(@Override)了「Bmi」 類別的「onCreate」 方法。原本繼承自 「Activity」類別的「onCreate」方法,其原本內容都被覆載掉了。因此想將原本的「onCreate」方法內容保留,並在其中加入我們的內容的話,就要使用「super」語句。當程式運行到我們覆寫的「onCreate」 方法時,透過「super.onCreate(savedInstanceState);」語句,會先將原本「Activity」類別中的「onCreate」方法執行一次,然後再執行我們覆寫的「onCreate」方法裡面其他的程式內容。 我們要執行原本的「onCreate」 方法時,仍然需要
- 粉丝: 17
- 资源: 59
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Unity适用于Windows与移动平台双端的轮盘交互式提示菜单
- UE5/UE4超详细教程接入科大讯飞语音唤醒SDK并初始持久监听(10102错误码解决)
- 靠搬运古装剧解说视频,日收益200+,作品原创度90%以上,超详细教程-教程网盘链接提取码下载 .txt
- 2024最强数学建模之美赛攻略.md
- STM32单片机FPGA毕设电路原理论文报告一种机器人寻线控制系统
- STM32单片机FPGA毕设电路原理论文报告一种光电编码器位置检测系统研究与应用
- linux常用命令大全
- ACM题库,分类整理.md
- STM32单片机FPGA毕设电路原理论文报告一种高速折刀运动控制系统的设计与实现
- ZYWIFI0939C循迹、红外避障、遥控综合程序.plg
- 1
- 2
- 3
- 4
- 5
- 6
前往页