Hello,Android:快速入门
在这个两部分的指南中,你将使用 Visual Studio 生成第一个 Xamarin.Android 应用程序,并了解使用 Xamarin 进行 Android 应用程序开发的基础知识。
你将创建一个应用程序,它将字母数字电话号码(由用户输入)转换为数字电话号码,然后向用户显示此数字电话号码。 最终应用程序如下所示:
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
,然后单击“确定”:
在“新 Android 应用”对话框中,依次单击“空白应用”和“确定”,以新建项目:
创建布局
提示
Visual Studio 的较新版本支持在 Android Designer 中打开 .xml 文件。
.axml 和 .xml 文件均受 Android Designer 支持。
创建新项目之后,在“解决方案资源管理器”中展开 Resources 文件夹,然后展开 layout 文件夹。 双击“activity_main.axml”,以在 Android Designer 中打开它。 这是应用屏幕的布局文件:
提示
较新版本的 Visual Studio 包含的应用模板略有不同。
- 布局位于 content_main.axml 中,而不是 activity_main.axml 中。
- 默认布局是
RelativeLayout
。 要执行本页面上的其他步骤,应将<RelativeLayout>
标记更改为<LinearLayout>
,并将其他属性android:orientation="vertical"
添加到LinearLayout
开始标记。
在“工具箱”(左侧区域)的搜索字段中输入 text
,并将一个“文本(大)”小组件拖动至 Design Surface 上(中央区域):
在 Design Surface 上选中“文本(大)”控件的情况下,可使用“属性”窗格将“文本(大)”小组件的 Text
属性更改为 Enter a Phoneword:
:
将一个“纯文本”小组件从“工具箱”拖动到设计图面上,并将它放置在“文本(大)”小组件下。 直到将鼠标指针移动到布局中可接受小组件的位置,才会放置小组件。 在下面的屏幕截图中,直到鼠标指针移动到前一个 TextView
的下方(如右图所示),才能放置小组件(如左图所示):
正确放置“纯文本”(EditText
小组件)后,它将如以下屏幕截图所示:
在 Design Surface 上选中“纯文本”小组件的情况下,可使用“属性”窗格将“纯文本”小部件的 Id
属性更改为 @+id/PhoneNumberText
,并将 Text
属性更改为 1-855-XAMARIN
:
将一个“按钮”从“工具箱”拖动到设计图面上,并将它放置在“纯文本”小组件下方:
在 Design Surface 上选中“按钮”后,使用“属性”窗格将其 Text
属性更改为 Translate
,将其 Id
属性更改为 @+id/TranslateButton
:
将一个“TextView”从“工具箱”拖动到 Design Surface 上,并将其置于“按钮”小组件下方。 将“TextView”的 Text
属性更改为空字符串,并将其 Id
属性设置为 @+id/TranslatedPhoneword
:
通过按 CTRL+S 来保存工作。
编写代码
下一步是添加一些代码,以将电话号码从字母数字转换为数字。 通过在“解决方案资源管理器”窗格中右键单击“Phoneword”项目,然后选择“添加”>“新建项…”以向项目添加新文件,如下所示:
在“添加新项”对话框中,选择“Visual C#”>“代码”>“代码文件”,然后将新代码文件命名为“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”转换为电话号码:
若要在 Android 设备上运行应用,请参阅如何设置设备以进行开发。
从“应用程序”文件夹或从 Spotlight 启动 Visual Studio for Mac。
单击“新建项目...”以创建新项目。
在“为新项目选择模板”对话框中,单击“Android”>“应用”,然后选择“Android 应用”模板。 单击 “下一步” 。
在“配置 Android 应用”对话框中,将新应用命名为 Phoneword
,然后单击“下一步”。
在“配置新的 Android 应用”对话框中,将“解决方案”和“项目”名称保留设置为 Phoneword
,然后单击“创建”以创建项目。
创建布局
提示
Visual Studio 的较新版本支持在 Android Designer 中打开 .xml 文件。
.axml 和 .xml 文件均受 Android Designer 支持。
创建新项目之后,在“解决方案”板中展开 Resources 文件夹,然后展开 layout 文件夹。 双击 Main.axml 以在 Android 设计器中打开它。 这是在 Android Designer 中进行查看时屏幕的布局文件:
选择 Hello World,单击我! 在设计图面上按按钮,然后按 Delete 键将其删除。
在“工具箱”(右侧区域)中,向搜索字段中输入 text
并将一个“文本(大)”小部件拖动到设计图面上(中央区域):
在设计图面上选择了“文本(大)”小部件的情况下,可以使用“属性”板将“文本(大)”小部件的 Text
属性更改为 Enter a Phoneword:
,如下所示:
接下来,将一个“纯文本”小组件从“工具箱”拖动到设计图面上,并将它放置在“文本(大)”小组件下。 请注意,可以使用搜索字段帮助按名称查找小组件:
在设计图面上选择了“纯文本”小部件的情况下,可以使用“属性”板将“纯文本”小部件的 Id
属性更改为 @+id/PhoneNumberText
,并将 Text
属性更改为 1-855-XAMARIN
:
将一个“按钮”从“工具箱”拖动到设计图面上,并将它放置在“纯文本”小组件下方:
在设计图面上选择了“按钮”的情况下,可以使用“属性”板将“按钮”的 Id
属性更改为 @+id/TranslateButton
,并将 Text
属性更改为 Translate
:
将一个“TextView”从“工具箱”拖动到 Design Surface 上,并将其置于“按钮”小组件下方。 选中“TextView”后,将“TextView”的 id
属性设置为 @+id/TranslatedPhoneWord
,并将 text
更改为一个空字符串:
通过按 ⌘ + S 来保存工作。
编写代码
现在添加一些代码,以将电话号码从字母数字转换为数字。 通过在“解决方案”板中单击“Phoneword”项目旁的齿轮图标,然后选择“添加”>“新建文件...”,向项目添加新文件:
在“新建文件”对话框中,选择“常规”>“空类”,将新文件命名为 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 更新。
设置标签和应用图标
你现在具有可正常工作的应用程序,可以添加完成收尾工作了! 首先编辑 MainActivity
的 Label
。
Label
是 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”文件:
需要从项目中删除每个图标文件。 右键单击每个“Icon.png”文件,然后从上下文菜单中选择“删除”:
单击对话框中的“删除”按钮。
接着,下载并解压缩 Xamarin 应用图标集。 此 zip 文件包含应用程序的图标。 尽管每个图标看上去都相同,但它们具有不同的分辨率,使它们能在具有不同屏幕密度的不同设备上正确呈现。 必须将此文件集复制到 Xamarin.Android 项目中。 在 Visual Studio for Mac 的“Solution Pad”中,右键单击 mipmap-hdpi 文件夹,然后选择“添加”>“添加文件”:
从选择对话框中,导航到已解压缩的 Xamarin AdApp 图标目录并打开 mipmap-hdpi 文件夹。 选择“Icon.png”,然后单击“打开”。
在“将文件添加到文件夹”对话框中,选择“将文件复制到目录中”,然后单击“确定”:
为每个 mipmap- 文件夹重复执行这些步骤,直到 mipmap- Xamarin 应用图标文件夹的内容复制到其在 Phoneword 项目中对应的 mipmap- 文件夹为止。
在所有图标都复制到 Xamarin.Android 项目中后,在“Solution Pad”中右键单击项目,打开“项目选项”对话框。 选择“生成”>“Android 应用程序”,然后从“应用程序图标”组合框中选择 @mipmap/icon
:
运行应用
最后,通过在 Android 设备或仿真器上运行应用程序并转换 Phoneword 以测试此应用程序:
若要在 Android 设备上运行应用,请参阅如何设置设备以进行开发。
祝贺你完成第一个 Xamarin.Android 应用程序! 现在可以仔细分析刚刚学习的工具和技能。 接下来是 Hello,Android 深入了解。