我的第一個 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” 。

Create first Mono for Android Application

熟悉默認項目模板

現在, 先不要做其它的, 先來熟悉一下這個項目, 打開項目屬性對話框, 看看每個節點都有什么設置項, 重點熟悉下面幾個節點:

  • 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 , 如下圖所示:

Create new 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 , 如下圖所示:

Create 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>

然后切換到設計視圖, 看起來如下圖所示:

Main Activity

在 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>

Second Activity Layout

使用 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 , 顯示界面如下:

MainActivity

點擊 Send 按鈕, 會啟動 SecondActivity , 並將輸入的信息顯示在界面上:

SecondActivity

總結

Mono for Android 初體驗感覺不錯, 對於有經驗的 .Net 開發人員來講, 上手的速度非常快, 只要稍微學習一下 Android 的 UI 方面的知識就可以了。 MonoDevelop 的界面和 VS 很相似, 上手也是很容易的事情。 還是那句話, Mono for Android 最大的好處是可以利用現有的 .Net 代碼, CodePlex 以及 Github 上有豐富的資源可以利用, 如果你熟悉 .Net 開發, Mono for Android 也是值得一試的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM