您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
我的第一个 Mono for Android 应用
 
作者:张志敏 来自于:博客园 发布于 2015-9-21
   次浏览      
 

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

   
次浏览       
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试
最新活动计划
LLM大模型应用与项目构建 12-26[特惠]
QT应用开发 11-21[线上]
C++高级编程 11-27[北京]
业务建模&领域驱动设计 11-15[北京]
用户研究与用户建模 11-21[北京]
SysML和EA进行系统设计建模 11-28[北京]

android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   

Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合

领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...