

界面操作
单击“将文本转换为数字”,观察结果。
单击【转换】按钮,如果转换成功,则【拨号】按钮可用,单击【拨号】按钮,观察弹出的对话框。
如果单击【拨号】按钮,就会自动拨号。
下面介绍主要设计步骤。
1、新建项目
选择模板:Blank App (Android),项目名:PhonewordApp。

项目创建成功后,删除GettingStarted.Xamarin(广告文件)。
2、界面设计
(1)双击打开Main.axml,分别观察设计界面【Design】和源码【Source】的内容。

(2)按Delete键删除【Hello World,Click Me】按钮。
(3)从【工具箱】中拖放一个【Text (Large)】到设计界面,修改下面的属性:
id:@+id/PhoneText
text:电话
注:此时系统会自动在【Source】中添加对应的代码(下同)。
(4)从【工具箱】中拖放一个【Plain Text】到设计界面,放到【Text (Large)】的下方,修改下面的属性:
id:@+id/PhoneNumberText
text:138 4912 2599
(5)从【工具箱】中拖放一个【Button】到设计界面,放到【Plain Text】的下方,修改下面的属性:
id:@+id/buttonTranslate
text:转换
(6)从【工具箱】中拖放一个【Button】到设计界面放到上一个按钮的下方,修改属性:
id:@+id/buttonCall
text:拨号
经过以上步骤后,即得到下图所示的设计界面:

(7)保存文件,并单击【解决方案资源管理器】上方的【刷新】按钮。
注意:这一步的目的是为了让系统能找到设计界面内的资源并自动生成对应的ID,以便在后面键入C#代码时能看到与设计界面资源相关的智能提示。
3、编写C#代码
(1)鼠标右击项目名à添加类,在弹出的窗口中,选择【Class】模板,名称:PhoneTranslator.cs,如下图所示,单击【添加】按钮。

然后将PhoneTranslator.cs改为下面的代码:
using System.Text;namespace PhonewordApp{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);}}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;}}}(2)打开MainActivity.cs,将该文件改为下面的代码:using System;using Android.App;using Android.Content;using Android.Runtime;using Android.Views;using Android.Widget;using Android.OS;using System.Collections.Generic;namespace PhonewordApp{[Activity(Label = "PhonewordApp", MainLauncher = true, Icon = "@drawable/icon")]public class MainActivity : Activity{static readonly List<string> phoneNumbers = new List<string>();protected override void OnCreate(Bundle bundle){base.OnCreate(bundle);SetContentView(Resource.Layout.Main);var phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);var buttonTranslate = FindViewById<Button>(Resource.Id.buttonTranslate);var buttonCall = FindViewById<Button>(Resource.Id.buttonCall);buttonCall.Enabled = false; //禁用【拨号】按钮string translatedNumber = string.Empty;buttonTranslate.Click += (s, e) =>{translatedNumber = PhonewordTranslator.ToNumber(phoneNumberText.Text);if (string.IsNullOrWhiteSpace(translatedNumber)){buttonCall.Text = "拨号";buttonCall.Enabled = false;}else{buttonCall.Text = "播出号码:" + translatedNumber + ",单击确认!";buttonCall.Enabled = true;}};var buttonCallHistory = FindViewById<Button>(Resource.Id.buttonCallHistory);buttonCallHistory.Click += (sender, e) =>{var intent = new Intent(this, typeof(CallHistoryActivity));intent.PutStringArrayListExtra("phone_numbers", phoneNumbers);StartActivity(intent);};buttonCall.Click += (s, e) =>{phoneNumbers.Add(translatedNumber);buttonCallHistory.Enabled = true;// 当单击【拨号】时,尝试拨号var callDialog = new AlertDialog.Builder(this);callDialog.SetMessage("电话:" + translatedNumber + ",拨号吗?");callDialog.SetNeutralButton("拨号", delegate{var callIntent = new Intent(Intent.ActionCall);callIntent.SetData(Android.Net.Uri.Parse("tel:" + translatedNumber));StartActivity(callIntent);});callDialog.SetNegativeButton("取消", delegate { });callDialog.Show();};}}}(3)重新生成项目,确保无错误。
注:
(1)这一步必须做,否则因该App无拨号权限,拨号功能会失败。
(2)设置后,查看Properties文件夹下AndroidManifest.xml文件中自动添加的代码,理解权限设置的作用。
4、调试运行及代码片段解释
选择一种模拟器,然后按<F5>键调试运行。
注意:如果使用低于API 23的模拟器,必须设置项目属性(主菜单à项目属性),使用对应版本的API来编译应用程序,否则在模拟器上运行时可能会出现应用程序一闪就退出或者显示“应用程序已停止运行”的情况。
下面解释前面已经实现的代码片段的含义:
(1)如何显示Alert对话框
AlertDialog的详细用法见【第6章 UI设计(三)--对话框】。
(2)如何拨号
下面的代码演示了如何调用系统功能实现拨号:
var callIntent = new Intent(Intent.ActionCall);
callIntent.SetData(Android.Net.Uri.Parse("tel:" + translatedNumber));
StartActivity(callIntent);
注意:运行前需要先勾选【CALL PHONE】设置允许拨号权限,否则运行会出现异常:

5、创建第2个屏幕跟踪历史记录
(1)打开values文件夹下的Strings.xml文件,添加下面的代码:
<?xml version="1.0" encoding="utf-8"?><resources>……<string name="CallHistory">拨号记录</string></resources>(2)单击【解决方案资源管理器】上方的“刷新”按钮,或者重新生成项目。
namespace PhonewordApp{[Activity(Label = "CallHistoryActivity")]public class CallHistoryActivity : ListActivity{protected override void OnCreate(Bundle bundle){base.OnCreate(bundle);var phoneNumbers =Intent.Extras.GetStringArrayList("phone_numbers") ?? new string[0];this.ListAdapter = new ArrayAdapter<string>(this,Android.Resource.Layout.SimpleListItem1, phoneNumbers);}}}其中,c = a??b; 的含义相当于:if (a != null ){ c = a;} else { c = b;}……using System.Collections.Generic;namespace E01PhonewordApp{[Activity(Label = "E01PhonewordApp", MainLauncher = true, Icon = "@drawable/icon")]public class MainActivity : Activity{static readonly List<string> phoneNumbers = new List<string>();protected override void OnCreate(Bundle bundle){……var buttonCallHistory =FindViewById<Button>(Resource.Id.buttonCallHistory);buttonCallHistory.Click += (sender, e) =>{var intent = new Intent(this, typeof(CallHistoryActivity));intent.PutStringArrayListExtra("phone_numbers",phoneNumbers);StartActivity(intent);};buttonCall.Click += (s, e) =>{phoneNumbers.Add(translatedNumber);buttonCallHistory.Enabled = true;// 当单击【拨号】时,尝试拨号var callDialog = new AlertDialog.Builder(this);callDialog.SetMessage("播出号码:" + translatedNumber +",拨号吗?");callDialog.SetNeutralButton("拨号", delegate{// Create intent to dial phonevar callIntent = new Intent(Intent.ActionCall);callIntent.SetData(Android.Net.Uri.Parse("tel:" +translatedNumber));StartActivity(callIntent);});callDialog.SetNegativeButton("取消", delegate { });callDialog.Show();};}}}(6)重新生成项目,确保无错误。
到这里,我们就完成了用C#编写的第1个Android应用程序。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。