65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Xamarin 开发 Android C# 和 .NET 移动应用 – 第一部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (32投票s)

2012年3月29日

CDDL

4分钟阅读

viewsIcon

214147

使用 Visual Studio C# 构建 Android 应用程序。

使用 Xamarin 开发 Android C# 和 .NET 移动应用 – 第一部分

作者:Shalom Keynan, Pat Tormey MVP

引言

一位相识已久的朋友、新罕布什尔州 .Net 用户组 (Seacoast) 的负责人 Pat Tormey 请求我对 Xamarin 针对 Android 的 Mono 软件进行一次试用。我的任务是,从一个从未有过手机或 Android 开发经验的 C# .Net 开发者的角度,给出一个全新的、客观的概览。我们希望创建一个名为“Hello New-Hampshire .Net User Group”的演示应用,该应用能利用用户现有的 C# 和 Visual Studio 经验来开发 Android 应用。我们的目标是创建一个可以用作构建块、并且是一个良好起点的小型应用。我们想知道我们有多少 C# 知识可以迁移到 Android 开发中。

使用代码

网上有很多例子,但我们决定遵循 Xamarin 在线文档中的 “入门”指南;它包含了 5 个简单的步骤,帮助我开始了。我们发现它们的例子非常简洁且有帮助。Xamarin 提供了在 MonoDevelop 和 Visual Studio 2010 中进行开发的示例。我们建议遵循它们的教程,因为它们是一个很好的起点。我们也浏览了视频教程来提高我的 Android 开发知识,我们推荐 Pluralsight,它们是一个极好的培训网站。如果您还没有会员,我们强烈建议使用它们,无论如何,您都可以利用他们 10 天的免费试用,物超所值。

Android 项目概述

Android 应用以 Activity 开始,通常会有一个“axml 布局”用于显示 Activity->Layout 设置,这是构成显示及其支持功能的基本工作单元,明确定义为模型-视图-控制器 (MVC) 模式。

字符串等值干净地抽象到 Resources 文件夹下的 Values 文件夹中,作为值-属性对。
所有资源都抽象到资源文件夹中,该文件夹通过 Resource Designer 维护布局、图像、值和图标,Resource Designer 将友好名称映射到内部唯一的 ID。
Xamarin MonoDevelop IDE 和 Visual Studio IDE 都不支持所见即所得 (WYSIWYG) 开发。
MonDevelop 和 Visual Studio IDE 都支持部署到配置为匹配您预期的 Android 目标机器的模拟器。

入门

完成课程后,我们创建了一个名为 ShalomNHDN 的演示应用程序(Shalom 是希伯来语中的“问候”),它包含了基本功能和一些您在浏览代码和应用程序时需要注意的地方。

在完成了入门演示之后,我们决定在这个应用程序中构建一个示例应用程序,包含以下内容:

  • 添加 Activity 标题
  • 带有启动屏幕的应用程序启动
  • 使用默认的 Xaml 屏幕或动态构建布局。
  • 将 Activity 作为 Intent 启动并在 Activity 之间传递数据
  • 使用简单列表
  • 使用更高级的列表 – 一个示例,它将列表进行格式化并呈现列表(第二部分)

首先,您会注意到启动应用程序会启动模拟器、部署/更新包并启动应用程序。如果您查看 Android 仪表板,您将看到应用程序名称和应用程序图标。这些信息由启动 Activity 上的行配置。

  
  [Activity(Label = "Shalom NHDN", MainLauncher = true
      ,Theme = "@style/Theme.SplashNHDN", NoHistory = true
      , Icon = "@drawable/MyIcon")]



Label 是图标下方的文本,图标位于 Resources\Drawable\ 目录中。默认图标是 72x72 像素的 icon.png。您可以使用 PNG 或 GIF 文件,并且可以在 http://www.findicons.com 网站上找到更多图标。注意:64x64 像素的图标效果很好(动画 GIF 似乎不起作用)。
NHDN 应用程序使用 SplashActivity ( MainLauncher = true ) 启动,并使用默认主题 (Theme= "@style/Theme.SplashNHDN"). 该主题位于 resource\values 目录中,指向一个 nhdnsplash.png 文件(480x480 像素)。

<resources>
    <style name="Theme.SplashNHDN" parent="android:Theme">
        <item name="android:windowBackground">@drawable/nhdnsplash</item>
     </style>
</resources>





我们使用以下代码来启动下一个 Activity:


protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            System.Threading.Thread.Sleep(1000);
            // Start our real activity
            StartActivity(typeof(FirstActivity));
        }





手机应用屏幕启动 Activity
**






第一个 Activity (屏幕) 的布局有两种定义方式。您可以使用 axml 布局或动态构建屏幕布局。

使用 AXML 文件

    //Uses aXml template and display items
         // Set our view from the "main" layout resource
                SetContentView(Resource.Layout.Main);
                // Get our button from the layout resource,
                // and attach an event to it
                Button button = FindViewById<Button>(Resource.Id.MyButton);
                TextView aLabel2 = FindViewById<TextView> (Resource.Id.helloLabel);
                button.Click += delegate
                {
                    button.Text = string.Format("{0} user clicks!", count++);
                    aLabel2.Text = "Hello NHDN! " + count.ToString();
                };


屏幕上的布局将与您的 XAML 文件显示相同。

动态构建屏幕布局


 //Create the user interface in code
               var layout = new LinearLayout(this);
               layout.Orientation = Orientation.Vertical;
 
               var aLabel = new TextView(this);
               //aLabel.Text = "Hello, NHDN for Android";  
               // Set label as Fix text or from resource file
               aLabel.SetText(Resource.String.helloLabelText);
 
               var aButton = new Button(this);
               aButton.SetText(Resource.String.helloButtonText);
 
               ////Lambda way to delegate event
               //aButton.Click += (sender, e) =>
               //{
               //    aLabel.Text = "Hello from the button";
               //};
               aButton.Click += delegate(object sender, EventArgs e)
               {
                aLabel.Text = string.Format("You clicked me {0} times "+
 DateTime.Now.ToString() , count++);
               };
 
               var aButton1 = new Button(this);
               //aButton.Text = "Say Hello";
               aButton1.Text="Start Second Activity";
 
               aButton1.Click += delegate(object sender, EventArgs e)
               {
                   aButton1.Text = string.Format("clicked {0} " 
+ DateTime.Now.ToString(), count++);
                //  StartActivity(typeof(SecondActivity));
        // start activity as intent and pass data between activities
                 var second = new Intent(this, typeof(SecondActivity));
                 second.PutExtra("ActivityData", "Data from FirstActivity: " + aLabel.Text);
                 StartActivity(second);        
               };
 
 
               layout.AddView(aLabel);
               layout.AddView(aButton);
               layout.AddView(aButton1);
               SetContentView(layout);

默认 AXML 布局动态布局
**

在屏幕之间传递数据

要在屏幕之间传递数据,请使用 Intent 并放置以下代码:
注意显式使用 INTENT,它为 Activity 准备了更多信息。如果您不传递数据,可以使用隐式 INTENT 启动 Activity。

var second = new Intent(this, typeof(SecondActivity));
second.PutExtra("ActivityData", "Data from FirstActivity: " + aLabel.Text);
StartActivity(second);  


在接收屏幕上


注意如何查询 INTENT 以获取调用 Activity 传递的数据。

//Get data from FirstActivity
var label = FindViewById<TextView> (Resource.Id.screen2Label);
label.Text = Intent.GetStringExtra("ActivityData") ?? "Data not available";




在 Activity 之间传输数据

第一个 Activity第二个 Activity
**

简单列表


使用 XML 加载简单列表。首选从资源文件中加载 XML 数据,最终您会想考虑从 Web 服务或本地资源文件中获取数据。在本场景中,我们探讨了从本地资源文件加载数据的方法。
simple list 类实现了 ListActivity,因此 ListView 指的是资源布局中的 listview 部件。我们在选中项目点击事件中添加了一个 toast 消息。


 [Activity(Label = "Simple List of Books - Activity")]
    public class SimpleListActivity : ListActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
             SetContentView(Resource.Layout.Main_list_view);
            // get list of books from xml file in your resource
            string[] books = Resources.GetStringArray(Resource.Array.books_array);
            ListAdapter = new ArrayAdapter<string>(this, Resource.Layout.list_item,  books);
 
            ListView.TextFilterEnabled = true;
            // add a listener to Item click 
            ListView.ItemClick += delegate(object sender, ItemEventArgs args)
            {
                // When clicked, show a toast with the TextView text
                 Toast.MakeText(Application," Selected Item: "+ ((TextView)   args.View).Text,ToastLength.Short).Show();
 }; 
        }
    }






通过 AXML 文件设置屏幕布局

<?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" 
    android:background="#0066CC"  >
    <ListView android:id="@android:id/list"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent">
    </ListView>
</LinearLayout>

简单列表 Activity

结论


使用 Android 非常直接,您可以最大限度地利用您的 C# 知识,并借助 Visual Studio 的 Xamarin 工具包,很快就能让您的第一个应用程序运行起来。

参考 - 有用的链接;


以下是 Android 开发的有用链接。

© . All rights reserved.