我的第一個 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 也是值得一試的。