Android应用程序 Android制作简单单页导航
2016-06-22 14:10
288 查看
本例子演示如何添加一个简单的单页导航,在此基础上,再演示如何在第2个页面中显示第1个页面中拨打过的所有电话号码。
(1)通过该例子理解Android App的基本架构。
(2)通过该例子理解实现Android多屏幕导航的基本技术。
本例子只是为了让我们对Android App开发有一个较全面的感性认识,读者不必一开始就纠结于代码中的细节问题,涉及到的相关概念在后面还会分别介绍。
运行截图
运行截图(Api19、Api21、Api23的实现代码都相同):
界面操作
单击“将文本转换为数字”,观察结果。
单击【转换】按钮,如果转换成功,则【拨号】按钮可用,单击【拨号】按钮,观察弹出的对话框。
如果单击【拨号】按钮,就会自动拨号。
下面介绍主要设计步骤。
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改为下面的代码:
?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
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,将该文件改为下面的代码:
?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
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)重新生成项目,确保无错误。
注:drawable文件夹下的Icon.png是要显示的图标,也可将其换为其他图标文件。
(4)选择主菜单下该项目的属性,在弹出的窗口中,勾选【CALL PHONE】权限:
注:
(1)这一步必须做,否则因该App无拨号权限,拨号功能会失败。
(2)设置后,查看Properties文件夹下AndroidManifest.xml文件中自动添加的代码,理解权限设置的作用。
4、调试运行及代码片段解释
选择一种模拟器,然后按<F5>键调试运行。
注意:如果使用低于API 23的模拟器,必须设置项目属性(主菜单à项目属性),使用对应版本的API来编译应用程序,否则在模拟器上运行时可能会出现应用程序一闪就退出或者显示“应用程序已停止运行”的情况。
下面解释前面已经实现的代码片段的含义:
(1)如何显示Alert对话框
AlertDialog的详细用法见【第6章 UI设计(三)--对话框】。
(1)通过该例子理解Android App的基本架构。
(2)通过该例子理解实现Android多屏幕导航的基本技术。
本例子只是为了让我们对Android App开发有一个较全面的感性认识,读者不必一开始就纠结于代码中的细节问题,涉及到的相关概念在后面还会分别介绍。
运行截图
运行截图(Api19、Api21、Api23的实现代码都相同):
界面操作
单击“将文本转换为数字”,观察结果。
单击【转换】按钮,如果转换成功,则【拨号】按钮可用,单击【拨号】按钮,观察弹出的对话框。
如果单击【拨号】按钮,就会自动拨号。
下面介绍主要设计步骤。
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改为下面的代码:
?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
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,将该文件改为下面的代码:
?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
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)重新生成项目,确保无错误。
注:drawable文件夹下的Icon.png是要显示的图标,也可将其换为其他图标文件。
(4)选择主菜单下该项目的属性,在弹出的窗口中,勾选【CALL PHONE】权限:
注:
(1)这一步必须做,否则因该App无拨号权限,拨号功能会失败。
(2)设置后,查看Properties文件夹下AndroidManifest.xml文件中自动添加的代码,理解权限设置的作用。
4、调试运行及代码片段解释
选择一种模拟器,然后按<F5>键调试运行。
注意:如果使用低于API 23的模拟器,必须设置项目属性(主菜单à项目属性),使用对应版本的API来编译应用程序,否则在模拟器上运行时可能会出现应用程序一闪就退出或者显示“应用程序已停止运行”的情况。
下面解释前面已经实现的代码片段的含义:
(1)如何显示Alert对话框
AlertDialog的详细用法见【第6章 UI设计(三)--对话框】。
相关文章推荐
- android中的广播
- Android——Service基础机制。
- Android 自定义可以滚动的ViewGroup
- android 隐藏输入法键盘
- Android高级控件之ExpandableListView可以展开的listview
- android:layout_weight的真实含义
- [Android Pro] root用户删除文件提示:Operation not permitted
- Android Studio Ndk环境搭建
- android成长树不规则布局的自适应
- AndroidStudio SDK离线更新
- 如何用 Gradle 构建 Android 工程项目
- 安卓简单开发-获取系统时间
- [Android Pro] adb 进入 recovery, adb 进入 bootloader
- Android原理揭秘之NavigationBar、StatusBar
- Android进阶之AS如何处理不同引用库(module)里jar的重复引起问题
- Android通信加密
- Android自定义View之IndicatorView,显示当前tab页所处位置的View
- Android Studio多渠道打包和代码混淆教程
- 利用递归算法和堆栈实现android思维导图大纲图的动态绘制
- android 仿小米日历 周视图 月视图切换