如果您熟悉在 Windows 上使用 Visual Studio 开发应用,那么使用 Xamarin Studio 应该非常简单。Xamarin 使用了包含一个或多个项目的解决方案的相同概念,并为 iOS 和安卓应用创建了几个新的项目类型。还有几个项目模板可以帮助您快速开发常见的应用。
Xamarin Studio 支持几种现成的项目类型,包括标准。NET 类库和控制台应用。您不能在带有 Xamarin Studio 的 Mac 上开发 Windows 应用,但是您可以在 Xamarin Studio 中开发应用的共享代码部分。我们将在后面的章节中重点介绍代码共享,但是请记住,Xamarin 使您能够在大多数支持 C#的平台之间共享一个通用的 C#后端。
在本章中,我们将介绍:
启动 Xamarin Studio 并启动新的解决方案。就像在 Visual Studio 中一样,有很多项目类型可以从新建解决方案对话框中创建。Xamarin Studio,前身为Mono developer,支持许多不同类型项目的开发,例如针对 Mono 运行时或的 C#应用。NET Core、NUnit 测试项目,甚至 C#之外的其他语言,比如 VB 或者 C++。
Xamarin Studio 支持 iOS 的以下项目类型:
UISplitViewController
。UITabViewController
的项目类型。UIPageViewController
作为转盘在屏幕之间分页。首先,创建一个新的解决方案并导航到 iOS | 应用,并创建一个单视图应用,如下图所示:
在 Visual Studio 中,您可以在新解决方案对话框中从 Visual C# | iOS | Universal |单视图 App 创建正确类型的项目。
下一步,我们需要:
在 Visual Studio 中,这些设置可以通过打开 iOS 项目的项目选项来获得。Xamarin Studio 的新项目对话框中有额外的步骤,但是您可以在事后编辑这些设置。
您会注意到几个文件和文件夹是从项目模板自动创建的。这些文件如下:
References
:这些都是你从. NET 知道的,喜欢的其他库的标准参考。Components
:该文件夹将包含从 Xamarin 组件存储中添加的任何组件。有关 Xamarin 组件存储的更多信息,请参见第 9 章、带有推送通知的网络服务。Resources
:该目录将包含您想要直接复制到您的应用捆绑包中的任何图像或普通文件。AppDelegate.cs
:这是苹果在你的应用中处理应用级事件的主要类。Entitlements.plist
:这是苹果用来声明某些 iOS 功能权限的设置文件,比如推送通知和 iCloud。您通常只需将其用于高级 iOS 功能。*ViewController.cs
:这是代表你 app 中第一个屏幕的控制器。它将与您的项目同名。Info.plist
:这是苹果版本的清单文件,可以为你的应用声明各种设置,比如应用标题、图标、闪屏和其他常见设置。LaunchScreen.storyboard
:这是一个故事板文件,用于为您的应用布局闪屏。默认情况下,Xamarin 的项目模板会将项目的名称放在这里。Main.cs
:这个文件包含一个 C#程序的标准入口点:static void Main()
。很可能您不需要修改此文件。MainStoryboard.storyboard
:这是你的应用的故事板定义文件。它将包含应用中视图的布局、控制器列表以及在整个应用中导航的过渡。故事板就是它听起来的样子:iOS 应用中不同屏幕的图表/流程图。现在,让我们运行应用,看看我们默认从项目模板中得到什么。点击 Xamarin Studio 左上角的大播放按钮。您将会看到运行第一个 iOS 应用的模拟器,如下图所示:
到目前为止,你的应用只是一个普通的白屏,这并不是很令人兴奋或有用。在继续下一步之前,让我们了解更多关于 iOS 开发的背景知识。
根据应用的最低 iOS 目标,您也可以在不同版本的 iOS 模拟器上运行应用。苹果还为 iPad 和目前市场上所有不同的 iOS 设备提供模拟器。知道这些是模拟器而不是仿真器也很重要。模拟器将运行移动操作系统的封装版本(就像安卓一样)。仿真器通常表现出较慢的性能,但给你一个真实操作系统的更接近的副本。苹果的模拟器作为原生 Mac 应用运行,不是真正的操作系统。好处是,与安卓模拟器相比,它们速度非常快。
了解苹果的 MVC 模式在 iOS 开发走得太远之前,先了解一下苹果在 iOS 上开发的设计模式,这真的很重要。您可能已经将模型视图控制器(MVC) 模式与其他技术(如【ASP.NET】)一起使用,但是苹果以稍微不同的方式实现了这个范例。苹果为 iOS 应用开发用户界面的核心应用接口集叫做 UIKit。Xamarin 应用可以通过直接使用 C#中的这些 API 来充分利用 UIKit。UIKit 在很大程度上基于 MVC 设计模式。
MVC 设计模式包括以下内容:
UIView
派生的任何类。例如工具栏、按钮以及用户在屏幕上看到并与之交互的任何东西。UIViewController
派生。这是 iOS 应用中很大一部分代码所在的地方。下图显示了 MVC 设计模式:
为了更好地理解这种模式,让我们看一下以下常见场景的示例:
UITextField
文本框中输入一些文本,点击UIButton
按钮开始搜索。这是视图层。UIActivityIndicatorView
微调器,并调用另一个类中的方法来执行搜索。这是控制器层。有关苹果 MVC 模式的更多信息,请参见https://developer . Apple . com/library/MAC/documentation/general/conceptive/devpedia-cocacore/MVC . html的文档网站。
需要注意的一点是,您可以在应用的模型层自由地做任何您想做的事情。这就是我们可以使用普通 C#类的地方,这些类可以在其他平台上重用,比如安卓。这包括使用 C# 基类库 ( 密件抄送)的任何功能,例如使用网络服务或数据库。我们将在本书后面更深入地探讨跨平台架构和代码共享概念。
使用 iOS 设计器由于我们的普通白色应用很无聊,让我们用一些控件修改应用的视图层。为此,我们将在 Xamarin Studio 或 Visual Studio 中修改您项目中的MainStoryboard.storyboard
文件。或者,您可以在 Xcode 中打开故事板文件,这是 Xamarin.iOS 设计器之前编辑故事板文件的方法。如果 iOS 故事板中有 Xcode 设计器中没有的功能,或者如果您需要编辑旧的 iOS 格式(如 XIB 文件),使用 Xcode 仍然很有用。然而,Xcode 并不是很好的体验,因为 Xcode 中的自定义控件呈现为普通的白色方块。Xamarin 的设计者实际上是在自定义控件中运行您的绘图代码,这样您就可以准确地看到应用在运行时的样子。
让我们通过执行以下步骤向应用添加一些控件:
MainStoryboard.storyboard
文件。UILabel
并拖动屏幕顶部居中的标签。UIButton
并创建 10 个编号为 0-9 的按钮,以创建一个数字键盘。您可以使用属性选项卡编辑按钮上的文本。您也可以使用复制/粘贴来加速创建它们。双击按钮将会添加一个 click 事件处理程序,这可能是您在为其他平台开发时从 Visual Studio 中熟悉的。您的应用应该开始看起来更像一个真实的应用(计算器),如下图所示:
在 Windows 上的 Visual Studio 中,这些步骤与 Mac 上的 Xamarin Studio 相同。请记住,要使用 Xamarin.iOS 设计器,您必须保持与本地网络上的 Mac 的连接。连接到苹果电脑的说明在第 1 章、 Xamarin 设置中。
现在,您可能想知道在这一点上向应用添加用户交互选项。在 Xcode 的 iOS 设计器中,您可以制作一个插座,使每个视图都可以从 C#中看到。出口是对故事板或 XIB 文件中的视图的引用,该视图将在运行时用该视图的实例填充。您可以将此概念与其他技术中的控件命名进行比较,如ASP.NET、网络表单或 WPF ( 视窗演示基础)。幸运的是,Xamarin 的 iOS 设计器比在 Xcode 中设置插座简单一点。您只需在属性选项卡中填写名称字段,Xamarin Studio 将在分部类中生成一个属性,使您可以从控制器访问标签和按钮。此外,您可以从故事板文件中连线一个动作,这是一个当事件发生时将被调用的方法。Xamarin Studio 将 iOS 操作公开为要在类中实现的部分方法。
让我们给应用添加一些交互,如下所示:
MainStoryboard.storyboard
文件。label
。OnAdd
输入到其上方的字段中。您可以将此记为按钮的“点击”事件。UIViewController
中放置OnAdd
方法的位置。OnEquals
输入到其上方的字段中。Xamarin 从以前在 Xcode 中的体验中大大改善了这种体验。对于那些更熟悉像 Visual Studio 这样的工具的人来说,Xcode 有一个奇怪的界面。创建出口的方法包括单击控件并将其拖动到 Objective-C 头文件上。对于有 C#背景的开发人员来说,仅仅填写一个名称字段要简单得多,也更直观。
现在我们已经定义了两个插座,您的控制器将提供两个新属性。展开解决方案中的*ViewController.cs
文件,打开*ViewController.designer.cs
文件。您将看到您的属性定义如下:
[Outlet]
[GeneratedCode ("iOS Designer", "1.0")]
MonoTouch.UIKit.UILabel label { get; set; }
修改此文件不是一个好主意,因为如果您在设计器或 Xcode 中做进一步的更改,IDE 将重新生成它。尽管如此,了解事情在幕后是如何运作的是一个很好的实践。
打开你的*ViewController.cs
文件,让我们用你的控制器的方法输入下面的代码:
partial void OnAdd(UIButton sender)
{
if (!string.IsNullOrEmpty(label.Text))
{
label.Text += "+";
}
}
partial void OnNumber(UIButton sender)
{
if (string.IsNullOrEmpty(label.Text) || label.Text == "0")
{
label.Text = sender.CurrentTitle;
}
else
{
label.Text += sender.CurrentTitle;
}
}
partial void OnEquals(UIButton sender)
{
//Simple logic for adding up the numbers
string[] split = label.Text.Split('+');
int sum = 0;
foreach (string text in split)
{
int x;
if (int.TryParse(text, out x))
sum += x;
}
label.Text = sum.ToString();
}
这些代码大部分只是让计算器运行的通用 C#逻辑。在OnAdd
方法中,如果标签的文本不是空的,我们会附加一个+
符号。在OnNumber
方法中,我们适当地替换或添加标签文本。最后,在OnEquals
方法中,我们通过字符串拆分操作和整数转换来计算标签中的表达式。然后,我们将结果放在标签的文本中。
运行您的应用,您将能够与您的计算器进行交互,如下图所示:
现在是你自己完成这个练习并完成计算器的好时机。添加减法、乘法、除法的按钮和一个“清除”按钮就可以完成这个简单的计算器。这应该能让你掌握使用苹果的应用编程接口UIButton
、UILabel
和 UIKit 框架的基础知识。
既然我们已经学习了在 Xamarin 的 iOS 设计器中布局控件以及在 C#中与插座交互的基础知识,那么让我们来学习一下 iOS 应用的标准生命周期。处理应用级事件的主要位置在AppDelegate
类中。
如果打开AppDelegate.cs
文件,可以覆盖以下方法:
FinishedLaunching
:这是申请的第一个入口点,应该会返回true
。DidEnterBackground
:这表示用户点击了自己设备上的 home 键或者是另一个应用,比如打电话,来到了前台。您应该执行保存用户进度或用户界面状态所需的任何操作,因为一旦被推到后台,iOS 可能会杀死您的应用。当您的应用在后台时,用户可能正在主屏幕中导航或打开其他应用。您的应用在内存中被有效地暂停,直到被用户恢复。WillEnterForeground
:这表示用户已经从后台重新打开了你的应用。您可能需要在这里执行其他操作,例如刷新屏幕上的数据等等。OnResignActivation
:如果操作系统在应用顶部显示系统弹出窗口,就会出现这种情况。例如日历提醒或用户可以从屏幕顶部向下滑动的菜单。OnActivated
:当用户返回你的应用时,这种情况会在OnResignActivation
方法执行后立即发生。ReceiveMemoryWarning
:这是操作系统发出的警告,要求释放应用中的内存。由于 C#的垃圾收集器,Xamarin 通常不需要它,但是如果你的应用中有任何重物,比如图像,这是一个处理它们的好地方。如果无法释放足够的内存,操作系统可能会终止您的应用。HandleOpenUrl
:如果你实现了一个 URL 方案,这就叫做HandleOpenUrl
,它相当于桌面平台上的文件扩展名关联。如果你注册你的应用打开不同类型的文件或网址,这个方法将被调用。同样,在您的*ViewController.cs
文件中,您可以在您的控制器上覆盖以下方法:
ViewDidLoad
:当加载了与您的控制器相关联的视图时,会出现这种情况。它只会在运行 iOS 6 或更高版本的设备上出现一次。ViewWillAppear
:这发生在你的视图出现在屏幕上之前。如果在应用中导航时有任何视图需要刷新,这通常是最好的地方。ViewDidAppear
:这发生在任何过渡动画完成之后,并且您的视图显示在屏幕上。在一些不常见的情况下,您可能需要在这里而不是在ViewWillAppear
中执行操作。ViewWillDisappear
:这个方法是在你的视图隐藏之前调用的。您可能需要在这里执行一些清理操作。ViewDidDisappear
:这发生在任何过渡动画完成后,用于在屏幕上显示不同的控制器。就像出现的方法一样,这发生在ViewWillDisappear
之后。还有其他几种方法可以覆盖,但许多方法在较新版本的 iOS 中已被否决。在http://developer.apple.com/library/ios熟悉苹果的文档网站。当试图理解苹果的应用编程接口如何工作时,阅读每个类和方法的文档是非常有帮助的。学习如何阅读(不一定是代码)Objective-C 也是一个有用的学习技巧,这样你就能够在开发 iOS 应用时将 Objective-C 示例转换为 C#了。
构建你的第一个安卓应用在 Xamarin Studio 中设置一个 Android 应用就像在 iOS 中一样简单,与在 Visual Studio 中的体验非常相似。Xamarin Studio 包括几个特定于安卓的项目模板,可以帮助您快速开始开发。
Xamarin Studio 包括以下项目模板:
启动 Xamarin Studio 并启动新的解决方案。在新解决方案对话框中,在安卓部分下创建一个新的安卓应用。挑选
您最终会得到一个类似于下面截图的解决方案:
在 Visual Studio 中,安卓项目模板位于安卓|空白 App 下。
您会注意到,已经为您创建了以下特定于安卓的文件和文件夹:
Components
文件夹。这与 iOS 项目相同,是从 Xamarin 组件存储中添加组件的地方。Assets
文件夹:该目录将包含具有AndroidAsset
的build
动作的文件。该文件夹将包含与安卓应用捆绑的原始文件。Properties/AndroidManifest.xml
:这个文件包含关于你的安卓应用的标准声明,比如应用名称、id 和权限。Resources
文件夹:资源是可以通过安卓的资源系统加载的图片、布局、字符串等。每个文件都有一个在Resources.designer.cs
中生成的标识,您可以用它来加载资源。Resources/drawable
文件夹:你的应用使用的任何图片一般都会放在这里。
Resources/layout
文件夹:这包含安卓用于声明用户界面的任何*.axml
(安卓 XML)文件。布局可以是整个活动、片段、对话框或子控件显示在屏幕上。
Resources/mipmap-*
文件夹:包含应用的图标,显示在不同安卓设备的主屏幕上。应用图标,因为它们的分辨率不同于设备的电流密度。Resources/values
文件夹:包含 XML 文件,用于声明整个应用中字符串(和其他类型)的键值对。这就是安卓系统上多种语言本地化的设置方式。MainActivity.cs
:这是MainLauncher
动作,也是你安卓应用的第一个活动。安卓应用没有static void Main
功能;将MainLauncher
设置为true
的活动开始执行。现在,让我们执行以下步骤来运行应用:
在 Windows 的 Visual Studio 中,您也可以尝试使用【Android 的 Visual Studio 仿真器。这是一个很好的模拟器,预装在 Visual Studio 2015 中。
当所有工作完成后,您已经部署了第一个安卓应用,只需一个按钮即可完成。您的应用将如下图所示:
了解安卓活动安卓操作系统非常注重活动的概念。活动是用户可以在屏幕上执行的任务或工作单元。例如,用户将执行用于拨打号码的电话活动,并执行用于与他们的地址簿交互以定位号码的第二活动。每个安卓应用都是一个或多个活动的集合,用户可以启动这些活动,并按下设备上的硬件后退键退出或取消。用户的历史记录保存在安卓后台堆栈中,在特殊情况下你可以通过代码进行操作。当一个新的活动开始时,前一个活动将暂停并保留在内存中以备后用,除非操作系统内存不足。
活动之间是松散耦合的;在某些方面,你可以认为它们在内存中有完全不同的状态。静态类、属性和字段将持续应用的生命周期,但通常的做法是在安卓包中传递一个状态。这对于传递列表中显示的项目的标识符以在新活动中编辑该项目非常有用。
活动有以下可以覆盖的生命周期回调方法:
OnCreate
:这是创建活动时调用的第一个方法。在这里设置您的视图并执行其他加载逻辑。最重要的是,您可以在这里调用SetContentView
来设置您的活动视图。OnResume
:当你的活动视图在屏幕上可见时,这就被称为。如果您的活动是第一次显示,并且当用户从另一个活动返回时,就会调用它。OnPause
:这是用来通知用户已经离开你的活动。这可能发生在导航到应用中的新活动、锁定屏幕或点击主页按钮之前。假设用户可能不会返回,因此您需要保存用户在此所做的任何更改。OnStart
:这发生在OnResume
即将在屏幕上显示活动视图之前。它发生在一个活动开始时,以及用户从另一个活动返回到它时。OnStop
:当活动的视图不再显示在屏幕上时,这种情况会在OnPause
之后立即发生。OnRestart
:当用户从上一个活动返回到你的活动时,这个方法出现。OnActivityResult
:此方法用于与安卓上其他应用中的其他活动进行通信。与StartActvityForResult
连用;例如,您可以使用它与脸书应用交互,以登录用户。OnDestroy
:当你的活动即将从内存中释放出来的时候,会调用这个。执行任何可以帮助操作系统的额外清理,例如处置活动正在使用的任何其他重量级对象。安卓生命周期的流程图如下:
与 iOS 不同的是,安卓不对开发者强制实施任何设计模式。然而,如果不在某种程度上了解安卓的活动生命周期,就不可能做到这一点。许多有活动的概念与 iOS 上的控制器有相似之处;比如OnStart
相当于ViwWillAppear
,OnResume
相当于ViewDidAppear
。
处理活动的其他注意方法如下:
StartActivity(Type type)
:这个方法在你的应用中启动一个新的活动,并且不向活动传递额外的信息。StartActivity(Intent intent)
:这是用Intent
开始一个新活动的重载方法。这使您能够向新活动传递附加信息,并且您还可以在其他应用中启动活动。StartActivityForResult
:该方法在活动操作完成时,以接收OnActivityResult
为预期开始新的活动。Finish
:这将关闭当前活动,并在完全关闭且不再显示在屏幕上时调用OnDestroy
。根据当前堆栈上的内容,用户将返回到之前的活动或主屏幕。SetContentView
:此方法设置活动要显示的主视图。在活动显示在屏幕上之前,应该在OnCreate
方法中调用它。FindViewById
:这是一种定位活动中显示的视图的方法。它有一个通用版本,用于返回适当类型的视图。你可以把intent
想象成一个描述从一个活动过渡到另一个活动的对象。您可以通过意图传递附加数据,以及修改活动的显示方式和用户的导航历史。
除了活动,安卓还有一个片段的概念。您可以将片段视为显示在父活动中的微型活动。片段有助于在整个应用中重用不同的用户界面,还可以帮助您在平板电脑上实现分屏导航。
Xamarin 的安卓设计师安卓项目的默认模板比 iOS 的内置功能多一点,所以我们稍后会移除一些控件。安卓用户界面布局是在人类可读且可编辑的 XML 文件中定义的。然而,Xamarin Studio 提供了一个优秀的设计工具,允许您拖放控件来定义您的安卓布局。让我们为您的应用添加更多功能,并开始使用安卓设计器。
返回 Xamarin Studio,执行以下步骤为您的应用添加功能:
Main.axml
。0
。@+id/textView1
。让我们将其更改为@+id/text
,以便稍后可以在 C#中与标签进行交互。@+id/button0
。@+id/plus
和@+id/equals
再创建两个按钮,它们的文本分别设置为 + 和 = 。在 Visual Studio 中,Xamarin。安卓设计者与 Xamarin 工作室的设计者基本相同。主要区别是在编辑控件的属性时,使用了标准的 Visual Studio 属性编辑器。您可能会发现通过属性面板中的工具栏按钮在 A 到 Z 和分组排序之间切换很有用。
现在,如果您尝试编译和运行您的应用,您会注意到一些编译器错误。现在,打开MainActivity.cs
并移除OnCreate
方法中的代码,调用SetContentView
的线路除外。
你的MainActivity
应该是这样的:
[Activity(Label = "Calculator", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Main);
}
}
现在启动您的 Android 应用,它应该看起来与您在设计器中所做的更改相同,如下所示:
切换回 Xamarin Studio,打开MainActivity.cs
。让我们修改活动,以便与我们在 Xamarin 中设置的布局进行交互。安卓设计师。我们使用FindViewById
方法通过我们在布局文件中设置的标识来检索视图。Xamarin Studio 还自动生成了一个名为Resource
的静态类,用于引用您的标识符。
首先在MainActivity.cs
中声明一个类级私有字段:
TextView text;
因此,让我们通过将该代码放入OnCreate
来检索文本视图字段的实例,如下所示:
text = FindViewById
Resource
类是 Xamarin 设计者将为您填充的静态类。为了将来参考,您可能需要为新的标识和其他资源构建您的安卓项目,以显示在 Xamarin 工作室的 C#文件中。
创建一个我们将用于点击事件的方法,在MainActivity.cs
的某个地方,它将看起来非常类似于我们在 iOS 上所做的:
private void OnNumber(object sender, EventArgs e)
{
var button = (Button)sender;
if (string.IsNullOrEmpty(text.Text) || text.Text == "0")
{
text.Text = button.Text;
}
else
{
text.Text += button.Text;
}
}
接下来,让我们在您的活动的OnCreate
方法中为number1
连接Click
事件:
var button = FindViewById<Button>(Resource.Id.number1);
button.Click += OnNumber;
对所有数字按钮 0-9 重复该代码。
接下来,让我们像在 iOS 应用中一样,为“添加”和“等于”按钮设置事件处理程序:
private void OnAdd(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(text.Text))
{
text.Text += "+";
}
}
private void OnEquals(object sender, EventArgs e)
{
//This is the same simple calculator logic as on iOS
string[] split = text.Text.Split('+');
int sum = 0;
foreach (string text in split)
{
int x;
if (int.TryParse(text, out x))
sum += x;
}
text.Text = sum.ToString();
}
接下来,让我们为您的活动的OnCreate
方法中的这些按钮连接Click
事件:
var add = FindViewById<Button>(Resource.Id.add);
add.Click += OnAdd;
var equals = FindViewById<Button>(Resource.Id.equals);
equals.Click += OnEquals;;
现在,如果我们运行该应用,我们将获得一个安卓应用,其功能与本章前面显示的 iOS 计算器相同:
总结在本章中,我们在 Xamarin Studio 中创建了第一个 iOS 应用。我们介绍了苹果的 MVC 设计模式,以更好地理解UIViewController
和UIView
之间的关系,还介绍了如何使用 Xamarin Studio 中的 iOS 设计器来编辑故事板文件。接下来,我们在 Xamarin Studio 中创建了第一个 Android 应用,并学习了 Android 中的活动生命周期。我们还使用了 Xamarin 的安卓设计器对安卓 XML 布局进行了更改。
从本章涵盖的主题来看,您应该对使用 Xamarin 的工具为 iOS 和 Android 开发简单的应用相当有信心。您应该对本机 SDK 和设计模式有基本的了解,以便在 iOS 和安卓上完成任务。
在下一章中,我们将介绍使用 Xamarin Studio 跨平台共享代码的各种技术。我们将讨论构建跨平台应用的不同方法,以及如何设置在 Visual Studio 或 Xamarin Studio 中使用的项目和解决方案。