Hello,Android:快速入门

在这个两部分的指南中,你将使用 Visual Studio 生成第一个 Xamarin.Android 应用程序,并了解使用 Xamarin 进行 Android 应用程序开发的基础知识

Download Sample下载示例

你将创建一个应用程序,它将字母数字电话号码(由用户输入)转换为数字电话号码,然后向用户显示此数字电话号码。 最终应用程序如下所示:

Screenshot of phone number translation app when it is complete.

Windows 要求

若要按照本演练进行操作,你需要以下内容:

  • Windows 10。

  • Visual Studio 2019 或 Visual Studio 2017(版本 15.8 或更高版本):Community、Professional 或 Enterprise。

macOS 要求

若要按照本演练进行操作,你需要以下内容:

  • Visual Studio for Mac 的最新版本。

  • 运行 macOS HIgh Sierra (10.13) 或更高版本的 Mac。

本演练假设最新版本的 Xamarin.Android 已在你选择的平台上安装并运行。 有关安装 Xamarin.Android 的指南,请参阅 Xamarin.Android 安装指南。

配置仿真器

如果使用的是 Android 仿真器,建议将仿真器配置为使用硬件加速。 通过硬件加速提高仿真器性能中提供了有关配置硬件加速的说明。

创建项目

启动 Visual Studio。 单击“文件”>“新建”>“项目”以创建新项目。

在“新建项目”对话框中,单击“Android 应用”模板。 将新项目命名为 Phoneword,然后单击“确定”

New project is Phoneword

在“新 Android 应用”对话框中,依次单击“空白应用”和“确定”,以新建项目:

Select the Blank App template

创建布局

提示

Visual Studio 的较新版本支持在 Android Designer 中打开 .xml 文件。

.axml 和 .xml 文件均受 Android Designer 支持。

创建新项目之后,在“解决方案资源管理器”中展开 Resources 文件夹,然后展开 layout 文件夹。 双击“activity_main.axml”,以在 Android Designer 中打开它。 这是应用屏幕的布局文件:

Open activity axml file

提示

较新版本的 Visual Studio 包含的应用模板略有不同。

  1. 布局位于 content_main.axml 中,而不是 activity_main.axml 中
  2. 默认布局是 RelativeLayout。 要执行本页面上的其他步骤,应将 <RelativeLayout> 标记更改为 <LinearLayout>,并将其他属性 android:orientation="vertical" 添加到 LinearLayout 开始标记。

在“工具箱”(左侧区域)的搜索字段中输入 text,并将一个“文本(大)”小组件拖动至 Design Surface 上(中央区域):

Add large text widget

在 Design Surface 上选中“文本(大)”控件的情况下,可使用“属性”窗格将“文本(大)”小组件的 Text 属性更改为 Enter a Phoneword:

Set large text properties

将一个“纯文本”小组件从“工具箱”拖动到设计图面上,并将它放置在“文本(大)”小组件下。 直到将鼠标指针移动到布局中可接受小组件的位置,才会放置小组件。 在下面的屏幕截图中,直到鼠标指针移动到前一个 TextView 的下方(如右图所示),才能放置小组件(如左图所示):

Mouse indicates where widget can be placed

正确放置“纯文本”(EditText 小组件)后,它将如以下屏幕截图所示

Add plain text widget

在 Design Surface 上选中“纯文本”小组件的情况下,可使用“属性”窗格将“纯文本”小部件的 Id 属性更改为 @+id/PhoneNumberText,并将 Text 属性更改为 1-855-XAMARIN

Set plain text properties

将一个“按钮”从“工具箱”拖动到设计图面上,并将它放置在“纯文本”小组件下方:

Drag translate button to the design

在 Design Surface 上选中“按钮”后,使用“属性”窗格将其 Text 属性更改为 Translate,将其 Id 属性更改为 @+id/TranslateButton

Set translate button properties

将一个“TextView”从“工具箱”拖动到 Design Surface 上,并将其置于“按钮”小组件下方。 将“TextView”的 Text 属性更改为空字符串,并将其 Id 属性设置为 @+id/TranslatedPhoneword

Set the properties on the text view.

通过按 CTRL+S 来保存工作。

编写代码

下一步是添加一些代码,以将电话号码从字母数字转换为数字。 通过在“解决方案资源管理器”窗格中右键单击“Phoneword”项目,然后选择“添加”>“新建项…”以向项目添加新文件,如下所示:

Add new item

在“添加新项”对话框中,选择“Visual C#”>“代码”>“代码文件”,然后将新代码文件命名为“PhoneTranslator.cs”:

Add PhoneTranslator.cs

这将创建新的空 C# 类。 在此文件中插入以下代码:

using System.Text;
using System;
namespace Core
{
    public static class PhonewordTranslator
    {
        public static string ToNumber(string raw)
        {
            if (string.IsNullOrWhiteSpace(raw))
                return "";
            else
                raw = raw.ToUpperInvariant();

            var newNumber = new StringBuilder();
            foreach (var c in raw)
            {
                if (" -0123456789".Contains(c))
                {
                    newNumber.Append(c);
                }
                else
                {
                    var result = TranslateToNumber(c);
                    if (result != null)
                        newNumber.Append(result);
                }
                // otherwise we've skipped a non-numeric char
            }
            return newNumber.ToString();
        }
        static bool Contains (this string keyString, char c)
        {
            return keyString.IndexOf(c) >= 0;
        }
        static int? TranslateToNumber(char c)
        {
            if ("ABC".Contains(c))
                return 2;
            else if ("DEF".Contains(c))
                return 3;
            else if ("GHI".Contains(c))
                return 4;
            else if ("JKL".Contains(c))
                return 5;
            else if ("MNO".Contains(c))
                return 6;
            else if ("PQRS".Contains(c))
                return 7;
            else if ("TUV".Contains(c))
                return 8;
            else if ("WXYZ".Contains(c))
                return 9;
            return null;
        }
    }
}

通过单击“文件”>“保存”(或按 CTRL+S)来保存对 PhoneTranslator.cs 文件进行的更改,然后关闭该文件。

关联用户界面

接下来,通过将支持代码插入到 MainActivity 类中来添加代码以关联用户界面。 首先关联“Translate”按钮。 在 MainActivity 类中找到 OnCreate 方法。 接下来,在 OnCreate 内的 base.OnCreate(savedInstanceState)SetContentView(Resource.Layout.activity_main) 调用下添加该按钮代码。 首先,修改模板代码,使 OnCreate 方法与以下内容相似:

using Android.App;
using Android.OS;
using Android.Support.V7.App;
using Android.Runtime;
using Android.Widget;

namespace Phoneword
{
    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);

            // New code will go here
        }
    }
}

获取对通过 Android 设计器在布局文件中创建的控件的引用。 在 OnCreate 方法中将以下代码添加到 SetContentView 调用后面:

// Get our UI controls from the loaded layout
EditText phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);
TextView translatedPhoneWord = FindViewById<TextView>(Resource.Id.TranslatedPhoneword);
Button translateButton = FindViewById<Button>(Resource.Id.TranslateButton);

添加对用户按“Translate”按钮进行响应的代码。 将以下代码添加到 OnCreate 方法(在上一步中添加的行后):

// Add code to translate number
translateButton.Click += (sender, e) =>
{
    // Translate user's alphanumeric phone number to numeric
    string translatedNumber = Core.PhonewordTranslator.ToNumber(phoneNumberText.Text);
    if (string.IsNullOrWhiteSpace(translatedNumber))
    {
        translatedPhoneWord.Text = string.Empty;
    }
    else
    {
        translatedPhoneWord.Text = translatedNumber;
    }
};

通过选择“文件”>“全部保存”(或按 CTRL-SHIFT-S)来保存工作,然后通过选择“生成”>“重新生成解决方案”(或按 CTRL-SHIFT-B)来生成应用程序。

如果发生错误,则完成前面的步骤并更正任何错误,直到应用程序成功生成。 如果收到生成错误(如“资源在当前上下文中不存在”),请验证 MainActivity.cs 中的命名空间名称是否与项目名称 (Phoneword) 匹配,然后完全重新生成解决方案。 如果仍收到生成错误,请验证已安装最新 Visual Studio 更新。

设置应用名称

你现在应具有可正常工作的应用程序 - 该设置应用名称了。 展开“值”文件夹(在“资源”文件夹中)并打开文件“strings.xml”。 将应用名称字符串更改为 Phone Word,如下所示:

<resources>
    <string name="app_name">Phone Word</string>
    <string name="action_settings">Settings</string>
</resources>

运行应用

通过在 Android 设备或仿真器上运行应用程序来测试该应用程序。 点击“转换”按钮,将“1-855-XAMARIN”转换为电话号码

Screenshot of app running

若要在 Android 设备上运行应用,请参阅如何设置设备以进行开发

从“应用程序”文件夹或从 Spotlight 启动 Visual Studio for Mac

单击“新建项目...”以创建新项目

在“为新项目选择模板”对话框中,单击“Android”>“应用”,然后选择“Android 应用”模板。 单击 “下一步”

Choose the Android App template

在“配置 Android 应用”对话框中,将新应用命名为 Phoneword,然后单击“下一步”

Configure the Android App

在“配置新的 Android 应用”对话框中,将“解决方案”和“项目”名称保留设置为 Phoneword,然后单击“创建”以创建项目

创建布局

提示

Visual Studio 的较新版本支持在 Android Designer 中打开 .xml 文件。

.axml 和 .xml 文件均受 Android Designer 支持。

创建新项目之后,在“解决方案”板中展开 Resources 文件夹,然后展开 layout 文件夹。 双击 Main.axml 以在 Android 设计器中打开它。 这是在 Android Designer 中进行查看时屏幕的布局文件:

Open Main.axml

选择设计图面上的“Hello World, 单击我!”按钮,然后按删除键将其删除。

在“工具箱”(右侧区域)中,向搜索字段中输入 text 并将一个“文本(大)”小部件拖动到设计图面上(中央区域):

Add large text widget

在设计图面上选择了“文本(大)”小部件的情况下,可以使用“属性”板将“文本(大)”小部件的 Text 属性更改为 Enter a Phoneword:,如下所示:

Set large text widget properties

接下来,将一个“纯文本”小组件从“工具箱”拖动到设计图面上,并将它放置在“文本(大)”小组件下。 请注意,可以使用搜索字段帮助按名称查找小组件:

Add plain text widget

在设计图面上选择了“纯文本”小部件的情况下,可以使用“属性”板将“纯文本”小部件的 Id 属性更改为 @+id/PhoneNumberText,并将 Text 属性更改为 1-855-XAMARIN

Set plain text widget properties

将一个“按钮”从“工具箱”拖动到设计图面上,并将它放置在“纯文本”小组件下方:

Add a button

在设计图面上选择了“按钮”的情况下,可以使用“属性”板将“按钮”Id 属性更改为 @+id/TranslateButton,并将 Text 属性更改为 Translate

Configure as the translate button

将一个“TextView”从“工具箱”拖动到 Design Surface 上,并将其置于“按钮”小组件下方。 选中“TextView”后,将“TextView”的 id 属性设置为 @+id/TranslatedPhoneWord,并将 text 更改为一个空字符串

Set the properties on the text view.

通过按 ⌘ + S 来保存工作。

编写代码

现在添加一些代码,以将电话号码从字母数字转换为数字。 通过在“解决方案”板中单击“Phoneword”项目旁的齿轮图标,然后选择“添加”>“新建文件...”,向项目添加新文件:

Add a new file to the project

在“新建文件”对话框中,选择“常规”>“空类”,将新文件命名为 PhoneTranslator,然后单击“新建”。 这会为我们创建新的空 C# 类。

在新类中删除所有模板代码,并将其替换为以下代码:

using System.Text;
using System;
namespace Core
{
    public static class PhonewordTranslator
    {
        public static string ToNumber(string raw)
        {
            if (string.IsNullOrWhiteSpace(raw))
                return "";
            else
                raw = raw.ToUpperInvariant();

            var newNumber = new StringBuilder();
            foreach (var c in raw)
            {
                if (" -0123456789".Contains(c))
                {
                    newNumber.Append(c);
                }
                else
                {
                    var result = TranslateToNumber(c);
                    if (result != null)
                        newNumber.Append(result);
                }
                // otherwise we've skipped a non-numeric char
            }
            return newNumber.ToString();
        }
        static bool Contains (this string keyString, char c)
        {
            return keyString.IndexOf(c) >= 0;
        }
        static int? TranslateToNumber(char c)
        {
            if ("ABC".Contains(c))
                return 2;
            else if ("DEF".Contains(c))
                return 3;
            else if ("GHI".Contains(c))
                return 4;
            else if ("JKL".Contains(c))
                return 5;
            else if ("MNO".Contains(c))
                return 6;
            else if ("PQRS".Contains(c))
                return 7;
            else if ("TUV".Contains(c))
                return 8;
            else if ("WXYZ".Contains(c))
                return 9;
            return null;
        }
    }
}

通过选择“文件”>“保存”(或按 ⌘ + S)来保存对 PhoneTranslator.cs 文件进行的更改,然后关闭该文件。 通过重新生成解决方案来确保没有编译时错误。

关联用户界面

下一步是通过向 MainActivity 类中添加支持代码来添加代码以关联用户界面。 在“Solution Pad”中双击“MainActivity.cs”中以打开它

首先将事件处理程序添加到“转换”按钮。 在 MainActivity 类中找到 OnCreate 方法。 在 OnCreate 中的 base.OnCreate(bundle)SetContentView (Resource.Layout.Main) 调用下添加按钮代码。 删除全部现有按钮处理代码(即引用 Resource.Id.myButton 并为其创建单击处理程序的代码),让 OnCreate 方法如下所示:

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

namespace Phoneword
{
    [Activity (Label = "Phone Word", MainLauncher = true)]
    public class MainActivity : Activity
    {
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);

            // Set our view from the "main" layout resource
            SetContentView (Resource.Layout.Main);

            // Our code will go here
        }
    }
}

接下来,需要引用使用 Android 设计器在布局文件中创建的控件。 将以下代码添加到 OnCreate 方法中(在 SetContentView 调用后面):

// Get our UI controls from the loaded layout
EditText phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);
TextView translatedPhoneWord = FindViewById<TextView>(Resource.Id.TranslatedPhoneWord);
Button translateButton = FindViewById<Button>(Resource.Id.TranslateButton);

通过向 OnCreate 方法添加以下代码(在最后一步中添加的行后面),来添加对用户按“Translate”按钮进行响应的代码:

// Add code to translate number
string translatedNumber = string.Empty;

translateButton.Click += (sender, e) =>
{
    // Translate user's alphanumeric phone number to numeric
    translatedNumber = PhonewordTranslator.ToNumber(phoneNumberText.Text);
    if (string.IsNullOrWhiteSpace(translatedNumber))
    {
        translatedPhoneWord.Text = string.Empty;
    }
    else
    {
        translatedPhoneWord.Text = translatedNumber;
    }
};

通过选择“生成”>“全部生成”(或按 ⌘ + B),来保存工作并生成应用程序。 如果应用程序进行了编译,则会在 Visual Studio for Mac 的顶部收到成功消息:

如果发生错误,则完成前面的步骤并更正任何错误,直到应用程序成功生成。 如果收到生成错误(如“资源在当前上下文中不存在”),请验证 MainActivity.cs 中的命名空间名称是否与项目名称 (Phoneword) 匹配,然后完全重新生成解决方案。 如果仍收到生成错误,请验证是否已安装最新的 Xamarin.Android 和 Visual Studio for Mac 更新。

设置标签和应用图标

你现在具有可正常工作的应用程序,可以添加完成收尾工作了! 首先编辑 MainActivityLabelLabel 是 Android 屏幕顶部显示的内容,用于让用户知道他们在应用程序中所处的位置。 在 MainActivity 类顶部,将 Label 更改为 Phone Word,如下所示:

namespace Phoneword
{
    [Activity (Label = "Phone Word", MainLauncher = true)]
    public class MainActivity : Activity
    {
        ...
    }
}

现在可以设置应用程序图标了。 默认情况下,Visual Studio for Mac 将为项目提供默认图标。 从解决方案中删除这些文件,然后使用不同的图标替换它们。 在“Solution Pad”中展开“Resources”文件夹。 请注意,有 5 个前缀为“mipmap-”的文件夹,每个文件夹都包含一个“Icon.png”文件

mipmap- folders and Icon.png files

需要从项目中删除每个图标文件。 右键单击每个“Icon.png”文件,然后从上下文菜单中选择“删除”

Delete default Icon.png

单击对话框中的“删除”按钮

接着,下载并解压缩 Xamarin 应用图标集。 此 zip 文件包含应用程序的图标。 尽管每个图标看上去都相同,但它们具有不同的分辨率,使它们能在具有不同屏幕密度的不同设备上正确呈现。 必须将此文件集复制到 Xamarin.Android 项目中。 在 Visual Studio for Mac 的“Solution Pad”中,右键单击 mipmap-hdpi 文件夹,然后选择“添加”>“添加文件”

Add files

从选择对话框中,导航到已解压缩的 Xamarin AdApp 图标目录并打开 mipmap-hdpi 文件夹。 选择“Icon.png”,然后单击“打开”

在“将文件添加到文件夹”对话框中,选择“将文件复制到目录中”,然后单击“确定”

Copy the file to the directory dialog

为每个 mipmap- 文件夹重复执行这些步骤,直到 mipmap- Xamarin 应用图标文件夹的内容复制到其在 Phoneword 项目中对应的 mipmap- 文件夹为止

在所有图标都复制到 Xamarin.Android 项目中后,在“Solution Pad”中右键单击项目,打开“项目选项”对话框。 选择“生成”>“Android 应用程序”,然后从“应用程序图标”组合框中选择 @mipmap/icon

Setting the project icon

运行应用

最后,通过在 Android 设备或仿真器上运行应用程序并转换 Phoneword 以测试此应用程序:

Screenshot of app when it is complete

若要在 Android 设备上运行应用,请参阅如何设置设备以进行开发

祝贺你完成第一个 Xamarin.Android 应用程序! 现在可以仔细分析刚刚学习的工具和技能。 接下来是 Hello,Android 深入了解