文章目錄
- 準備開發環境
- 建立 Mono for Android 應用
- 總結
我的第一個 Mono for Android 應用
Mono for Android 初體驗, 學習怎麼使用 Mono for Anrdoid 建立 android 應用, 如何使用 Intent 啟動 Activity , 如何在 Activity 之間傳遞參數。
準備開發環境下載並安裝 Mono for Android
在 OSX 系統下準備 Mono for Android 開發環境時比較容易的, 只要去 Xamarin 下載一個線上安裝程式, 安裝程式會自動下載並安裝所有的檔案, 甚至包括 JDK、 Android SDK 等, 沒什麼好說的, 一句話, 很簡單。
配置 Android 模擬器
啟動 MonoDevelop , 在 Tools 菜單下找到點擊 “Open AVD Manager” , 將會啟動 “Android Virtual Device Manager”, 建立一個新的 Android 虛擬裝置, Name 為 Droid4.1, Target 選擇 4.1, SD 記憶卡選擇 256, Skin 選擇內建的 WXGA720 , 等等, 一切可以參考 Google 的文檔。
需要注意的是, 要添加一個硬體選項 GPU emulation , 並設定為 true , 開啟 GPU 類比, 可以加快模擬器運行速度, 否則模擬器運行真的會很慢。
建立好了之後, 先運行一下模擬器, 確認一切配置正常了, 整個開發環境就算準備好了。
建立 Mono for Android 應用
開啟 MonoDevelop , 選擇建立解決方案, 左邊的分類選擇 "Mono for Android" , 右邊選擇 "Mono for Android Application" , 使用預設的模板建立一個 Mono for Android 應用程式, 如所示, 項目名稱為 “MyFirstApp” 。
熟悉預設項目模板
現在, 先不要做其它的, 先來熟悉一下這個項目, 開啟項目屬性對話方塊, 看看每個節點都有什麼設定項, 重點熟悉下面幾個節點:
- Build/General , 選擇 Target Framework ,設定編譯應用使用的 Android SDK 版本;
- Build/Mono for Android Build , 設定如 Linker 、 部署方式、 以及進階標籤下的的 CPU架構、 國際化等;
- Build/Mono for Android Application , 設定應用程式資訊, 也就是 AndroidManifest.xml 檔案的資訊;
項目預設的目錄結構如下如所示:
注意 Assets 和 Resource 目錄:
Assets 目錄, 如果應用需要用到二進位資源檔, 比如特殊字型、聲音等, 放在這個目錄下, 並將 BuildAction 設定為 AndrioidAsset , 資源將會和應用程式一起部署, 在運行時可以通過 AssetManager 使用類似下面的代碼進行訪問:
public class ReadAsset : Activity{ protected override void OnCreate (Bundle bundle) { base.OnCreate (bundle); InputStream input = Assets.Open ("my_asset.txt"); }}
另外,字型檔可以這樣載入:
Typeface tf = Typeface.CreateFromAsset( Context.Assets, "fonts/samplefont.ttf");
Resource 目錄, 包含應用程式所需的圖片、 布局描述、 二進位檔案和字串字典等資源檔。 比如, 一個簡單的 Android 應用程式套件含一個介面描述檔案 (main.axml) , 一個國際化的字串字典 (strings.xml) 以及表徵圖 (icon.png) , 這些檔案按照下面的結構儲存在 “Resource” 目錄內:
Resources/ drawable/ icon.png layout/ main.axml values/ strings.xml
為了讓編譯系統能夠將資源檔識別出 Android 資源, 需要將其編譯動作 (Build Action) 設定為 “Android Resource”。 上面的目錄結構經過編譯之後, 將會產生類似下面的檔案:
public class Resource { public class Drawable { public const int icon = 0x123; } public class Layout { public const int main = 0x456; } public class Strings { public const int FirstString = 0xabc; public const int SecondString = 0xbcd; }}
使用 Resource.Drawable.icon
可以引用 drawable/icon 檔案, Resource.Layout.main
可以引用 /layout/main.axml 檔案, 而使用 Resource.Strings.FirstString
則可以引用 values/strings.xml 檔案中的第一個字串。
以上這些和 Android SDK 文檔中介紹的都是大同小異的, 在 Mono for Android 環境下又加上了一些 .Net 特有的風格而已, 對於有經驗的 .Net 開發人員來說, 一看就懂了。
建立 Activity 及 View
與其它平台的應用程式不同, 這些平台上的應用程式通常都有一個單一的入口 main 函數, 應用程式都由這個入口函數啟動, 建立視窗、 維護介面。 而 Android 程式則不同, 一個 Android 程式由一些鬆散的 Activity 提供的介面組成, 因此看起來有點兒像 Web 應用程式, 任何一個 Activity 都可以通過 URL 啟動。
現在來建立一個 Activity , 在功能表列上選擇 File -> New -> File , 在彈出的建立檔案對話方塊中選擇 Android Activity , 如所示:
建立的 Activity 的代碼如下:
[Activity(Label = "MyFirstApp", MainLauncher = true)]public class MainActivity : Activity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); }}
注意 MainActivity 的 ActivityAttribute 標記, 這裡指定了兩個屬性, Label="MyFirstApp"
表示 Activity 的顯示名稱, MainLauncher=true
表示在應用程式列表中顯示, 在編譯時間, Mono for Android 會根據這些標記產生一個 AndroidManifest.xml , 並打包倒最終的 Android 應用程式中。
現在來建立 MainActivity 的視圖, 先選中項目的 Resources/layout 目錄, 在功能表列上選擇 File -> New -> File , 在彈出的建立檔案對話方塊中選擇 Android Layout , 如所示:
檔案名稱輸入 MainActivityLayout , MonoDevelop 預設會開啟設計檢視, 先切換到程式碼檢視, 粘貼下面的代碼:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/MessageEditText" android:layout_weight="1" android:hint="@string/MessageEditTextHint" /> <Button android:text="@string/SendButtonText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/SendButton" /></LinearLayout>
然後切換到設計檢視, 看起來如所示:
在 MainActivity.cs 檔案中的 base.OnCreate(bundle) 下面加入下面一句代碼, 讓 MainActivity 使用 MainActivityLayout :
this.SetContentView(Resource.Layout.MainActivityLayout);
用同樣的方法, 建立 SecondActivity 以及 SecondActivityLayout , SecondActivityLayout 的代碼以及設計介面如下:
<?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:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/MessageTextView" /></LinearLayout>
使用 Intent 啟動 Activity 並傳遞參數
如果現在運行程式, 將只能看到 MainActivity , 看不到 SecondActivity , 如果要想啟動 SecondActivity , 就需要用到 Intent 。 Android 通過 Intent 來啟動 Activity , 以及在 Activity 之間傳遞參數。
開啟 MainActivity , 添加一些代碼, 使其看起來如下所示:
[Activity(Label = "MyFirstApp", MainLauncher = true)]public class MainActivity : Activity { public const string ExtraMessage = "Cn.Beginor.MyFirstApp.MainActivity.ExtraMessage"; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // 設定布局檔案 this.SetContentView(Resource.Layout.MainActivityLayout); var sendBtn = this.FindViewById<Button>(Resource.Id.SendButton); // 為發送按鈕添加事件處理函數 sendBtn.Click += SendButtonClick; } void SendButtonClick (object sender, EventArgs e) { // 擷取使用者輸入的資訊 var msgEditText = this.FindViewById<EditText>(Resource.Id.MessageEditText); if (msgEditText == null) { return; } var msg = msgEditText.Text; // 建立 Intent 並傳遞使用者輸入的資訊 var intent = new Intent(this, typeof(SecondActivity)); intent.PutExtra(ExtraMessage, msg); // 啟動第二個 Activity this.StartActivity(intent); }}
再開啟 SecondActivity , 添加接收 ExtraMessage 並顯示的代碼:
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // 設定布局檔案 this.SetContentView(Resource.Layout.SecondActivityLayout); // 從 Intent 中擷取 ExtraMessage var intent = this.Intent; var msg = intent.GetStringExtra(MainActivity.ExtraMessage); // 將 ExtraMessage 顯示在 TextView 上 var textView = this.FindViewById<TextView>(Resource.Id.MessageTextView); textView.Text = msg;}
現在運行這個程式, 可以看到首先啟動的是 MainActivity , 顯示介面如下:
點擊 Send 按鈕, 會啟動 SecondActivity , 並將輸入的資訊顯示在介面上:
總結
Mono for Android 初體驗感覺不錯, 對於有經驗的 .Net 開發人員來講, 上手的速度非常快, 只要稍微學習一下 Android 的 UI 方面的知識就可以了。 MonoDevelop 的介面和 VS 很相似, 上手也是很容易的事情。 還是那句話, Mono for Android 最大的好處是可以利用現有的 .Net 代碼, CodePlex 以及 Github 上有豐富的資源可以利用, 如果你熟悉 .Net 開發, Mono for Android 也是值得一試的。