我的第一個 Mono for Android 應用

來源:互聯網
上載者:User
文章目錄
  • 準備開發環境
  • 建立 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 也是值得一試的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.