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

张志敏所有文章遵循创作共用版权协议,要求署名、非商业 、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。

本博客已经迁移到 GitHub , 围观地址: http://beginor.github.io/


本文转自张志敏博客园博客,原文链接:http://www.cnblogs.com/beginor/archive/2012/11/02/2751125.html,如需转载请自行联系原作者

相关文章
|
11天前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin协程的实践之路
【4月更文挑战第30天】在移动开发领域,随着用户需求的不断增长和设备性能的持续提升,实现流畅且高效的用户体验已成为开发者的首要任务。针对Android平台,Kotlin协程作为一种新兴的异步编程解决方案,以其轻量级线程管理和简洁的代码逻辑受到广泛关注。本文将深入探讨Kotlin协程的概念、优势以及在实际Android应用中的运用,通过实例演示如何利用协程提升应用性能和响应能力,为开发者提供一条构建更高效Android应用的实践路径。
|
2天前
|
开发工具 Android开发 Windows
Android应用] 问题2:ERROR: unknown virtual device name:
Android应用] 问题2:ERROR: unknown virtual device name:
|
2天前
|
XML JSON API
转Android上基于JSON的数据交互应用
转Android上基于JSON的数据交互应用
|
2天前
|
Android开发
Android应用实例(一)之---有道辞典VZ.0
Android应用实例(一)之---有道辞典VZ.0
|
3天前
|
安全 Java Android开发
构建高效Android应用:采用Kotlin进行内存优化的策略
【5月更文挑战第8天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,合理管理内存资源是确保应用流畅运行的关键因素之一。近年来,Kotlin作为官方推荐的开发语言,以其简洁、安全和互操作性的特点受到开发者青睐。本文将深入探讨利用Kotlin语言特性,通过具体策略对Android应用的内存使用进行优化,旨在帮助开发者提高应用性能,减少内存消耗,避免常见的内存泄漏问题。
7 0
|
4天前
|
移动开发 数据库 Android开发
构建高效Android应用:Kotlin协程的全面应用
【5月更文挑战第7天】 在移动开发领域,性能优化与流畅的用户体验是至关重要的。随着Kotlin语言的流行,其并发神器——协程,已成为提升Android应用性能的重要工具。本文将深入探讨如何在Android项目中利用Kotlin协程进行异步编程、网络请求和数据库操作,以及如何通过协程简化代码结构,增强应用的响应性和稳定性。我们的目标是为开发者提供一套实用的协程使用模式和最佳实践,以便构建更加高效的Android应用。
20 3
|
4天前
|
移动开发 数据库 Android开发
构建高效Android应用:Kotlin与协程的完美结合
【5月更文挑战第7天】 在移动开发领域,性能优化和资源管理始终是核心议题。随着Kotlin语言的普及,其提供的协程特性为Android开发者带来了异步编程的新范式。本文将深入探讨如何通过Kotlin协程来优化Android应用的性能,实现流畅的用户体验,并减少资源消耗。我们将分析协程的核心概念,并通过实际案例演示其在Android开发中的应用场景和优势。
|
7天前
|
移动开发 前端开发 Android开发
构建高效Android应用:探究Kotlin协程的优势
【5月更文挑战第4天】 在移动开发领域,尤其是对于Android开发者而言,编写响应迅速且高效的应用程序至关重要。Kotlin作为一种现代的编程语言,其提供的协程特性为异步编程带来了革命性的改变。本文将深入探讨Kotlin协程在Android开发中的应用优势,并通过实例代码展示如何利用协程简化异步任务处理,提高应用性能和用户体验。
|
7天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【5月更文挑战第4天】在移动开发的世界中,性能一直是衡量应用质量的重要指标。随着Kotlin的兴起,许多Android开发者开始考虑是否应该从传统的Java迁移到Kotlin。本文通过深入分析两者在Android平台上的性能差异,帮助开发者理解Kotlin在实际项目中的表现,并提供选择编程语言时的参考依据。
20 5
|
9天前
|
缓存 测试技术 Android开发
构建高效的Android应用:从设计到实现
【5月更文挑战第2天】 在移动设备日益普及的今天,打造一个既快速又流畅的Android应用对于开发者而言至关重要。本文将深入探讨如何优化Android应用的性能,涵盖UI设计的最佳实践、代码层面的性能提升技巧以及利用最新的Android框架和工具进行应用开发的策略。我们将通过实例分析,揭示那些影响应用响应速度和稳定性的关键因素,并提出切实可行的解决方案,帮助开发者构建出色的用户体验。