歡迎您光臨本站 註冊首頁

使用 Android、Scala 和 Eclipse 創建移動應用程序

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
Android 操作系統為移動開發提供強大、開放的平台。它利用了 Java™ 編程語言和 Eclipse 工具平台的威力。現在,還可以將 Scala 編程語言加入到其中。在本文中,您將看到如何使用 Scala 作為 Android 上的主要開發語言,從而可以使用一種更具表達力、更加類型安全的編程語言編寫移動應用程序。

先決條件

在本文中,我們將創建一個在 Android 設備上運行的移動應用程序。您將需要安裝 Android SDK;本文使用 V1.5 SDK。應用程序代碼將用 Scala 編程語言編寫。如果您從來沒用過 Scala,那麼沒有關係,因為本文將解釋 Scala 代碼。但是,即使您不熟悉 Scala,建議您至少熟悉 Java 語言。本文使用 Scala V2.7.5 進行開發。對於 Android 和 Scala 都提供了很好的 Eclipse 插件。本文使用 Eclipse V3.4.2 和 Android Development Tools(ADT) V0.9.1 以及 Scala IDE 插件 V2.7.5。請參閱 參考資料,獲得所有這些工具。





設置

編寫 Android 應用程序聽起來像是一個複雜的命題。Android 應用程序在它們自己的虛擬機中運行:Dalvik 虛擬機。但是,Android 應用程序的構建路徑是開放的。下面表明了我們將使用的基本策略。


圖 1. Android 上 Scala 的構建路徑


其思想是,我們首先將所有 Scala 代碼編譯成 Java 類文件。這是 Scala 編譯器的工作,所以這方面沒什麼太複雜的事情。接下來,獲取 Java 類文件,使用 Android dex 編譯器將類文件編譯成 Android 設備上的 Dalvik VM 使用的格式。這就是所謂的 dexing,也是 Android 應用程序的常規編譯路徑。通常,要經歷從 .java 文件到 .class 文件再到 .dex 文件的過程。在本文,惟一不同的是我們從 .scala 文件開始。最後,.dex 文件和其他應用程序資源被壓縮成一個 APK 文件,該文件可安裝到 Android 設備上。

那麼,如何讓這一切發生?我們將使用 Eclipse 做大部分工作。但是,此外還有一個較複雜的步驟:要讓代碼運行,還需要來自標準 Scala 庫中的代碼。在典型的 Scala 安裝中,這是 /lib/scala-library.jar 中一個單獨的 JAR。但是,這個 JAR 包括一些不受 Android 支持的代碼。有些代碼需要稍作調整,有些代碼則必須移除。scala-library.jar 的定製構建是運行得最好的,至少目前是這樣。請參閱 參考資料,了解這裡使用的定製構建。我們將把這個 JAR 稱作 Android 庫 JAR。

有了這個 JAR,剩下的事情就很容易了。只需使用 Eclipse 的 ADT 插件創建一個 Android 項目。然後將一個 Scala 特性(nature)添加到項目中。用前面談到的 Android 庫替代標準的 Scala 庫。最後,將輸出目錄添加到類路徑中。現在,可以開始了。主 Scala 站點對此有更詳細的描述(請參閱 參考資料)。現在,我們有了基本的設置,接下來看看我們將使用 Scala 創建的 Android 應用程序。





UnitsConverter

現在,我們知道如何利用 Scala 代碼,將它轉換成將在 Android 設備上運行的二進位格式,接下來可以使用 Scala 創建一個移動應用程序。我們將創建的應用程序是一個簡單的單位轉換應用程序。通過這個應用程序可以方便地在英制單位與公制單位之間來迴轉換。這是一個非常簡單的應用程序,但是我們將看到,即使是最簡單的應用程序也可以從使用 Scala 中獲益。我們首先看看 UnitsConverter 的布局元素。

創建布局

您也許對編寫手機上運行的 Scala 感到興奮,但是並非所有的移動開發編程都應該用 Scala 或 Java 語言完成。Android SDK 提供了一種很好的方式,使用基於 XML 的布局系統將用戶界面代碼與應用程序邏輯分離。我們來看看本文中的應用程序的主要布局文件,如清單 1 所示。


清單 1. Converter 應用程序的主要布局
				  <?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent" android:layout_height="fill_parent"      android:gravity="center_horizontal" android:padding="10px"      >      <TextView android:id="@+id/prompt_label" android:layout_width="wrap_content"          android:layout_height="wrap_content"           android:text="@string/prompt_metric"/>      <EditText android:id="@+id/amount" android:layout_below="@id/prompt_label"          android:layout_width="fill_parent"           android:layout_height="wrap_content"/>      <TextView android:id="@+id/uom_label"            android:layout_below="@id/amount"          android:layout_width="wrap_content"           android:layout_height="wrap_content"          android:text="@string/uom"/>      <Spinner android:id="@+id/uom_value"          android:layout_below="@id/uom_label"          android:layout_width="wrap_content"          android:layout_height="wrap_content"/>      <Button android:id="@+id/convert_button"          android:layout_below="@id/uom_value"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:text="@string/convert_button_label"/>      <TextView android:id="@+id/result_value"          android:layout_below="@id/convert_button"          android:layout_width="fill_parent"          android:layout_height="fill_parent"/>          </RelativeLayout>  

以上代碼非常簡潔地創建了該應用程序的主 UI。它的根節點是一個 RelativeLayout 容器元素。Android SDK 中有很多布局選項。RelativeLayout 指示運行時使用相對定位對不同的 UI 小部件進行布局。要使用相對定位,可添加可見元素 — 在這裡是一個 TextView 元素。這是用於顯示文本的一個簡單的元素。它被賦予一個 ID prompt_label。接下來的元素,即一個 EditText 元素(一個文本輸入框)將用到它。這個元素有一個 layout_below 屬性,它的值等於 prompt_label ID。換句話說,EditText 應該放在名為 prompt_label 的元素的下方。

布局代碼剩下的部分非常簡單。有一個帶標籤的文本輸入框、一個帶標籤的微調器(一個組合框或下拉框)、一個按鈕和一個用於輸出的文本框。圖 2 顯示正在運行的應用程序的一個截圖,其中標出了不同的元素。


圖 2. Android lLayout — 分解圖


那麼,以上視圖中看到的不同文本值來自哪裡呢?注意,清單 1 中的一些元素有一個 text 屬性。例如,prompt_label 元素有一個等於 @string/prompt_metric 的 text 屬性。這表明它將使用 Android 應用程序中一個標準的資源文件:strings.xml 文件,如清單 2 所示。


清單 2. strings.xml 資源
				  <?xml version="1.0" encoding="utf-8"?>  <resources>      <string name="prompt_metric">Enter amount (KM, g, L, C)</string>      <string name="prompt_english">Enter amount (miles, lbs, gallons,   F)</string>      <string name="uom">Units of Measure</string>      <string name="convert_button_label">Convert</string>      <string name="app_name">Converter</string>      <string name="english_units">English</string>      <string name="metric_units">Metric</string>  </resources>  

現在可以看到,圖 2 中所有的文本來自何處。微調器有一個下拉框,其中包含可用於度量的單位,那些單位在清單 2 中沒有列出。相反,它們來自另一個文件 arrays.xml,如清單 3 所示。


清單 3. arrays.xml 資源
				  <?xml version="1.0" encoding="utf-8"?>  <resources>      <array name="english_units">          <item>Fahrenheit</item>          <item>Pounds</item>          <item>Ounces</item>          <item>Fluid Ounces</item>          <item>Gallons</item>          <item>Miles</item>          <item>Inches</item>      </array>      <array name="metric_units">          <item>Celsius</item>          <item>Kilograms</item>          <item>Grams</item>          <item>Millileters</item>          <item>Liters</item>          <item>Kilometers</item>          <item>Centimeters</item>      </array>      </resources>  

現在,我們可以看到將用於微調器的那些值。那麼,這些值如何出現在微調器中,應用程序如何在英制單位與公制單位之間切換?要回答這些問題,我們需要看看應用程序代碼本身。




[火星人 ] 使用 Android、Scala 和 Eclipse 創建移動應用程序已經有854次圍觀

http://coctec.com/docs/linux/show-post-68815.html