![image](https://habrastorage.org/webt/xq/tq/w1/xqtqw1_zeons2xpkxwqrotupgky.jpeg)
Мы создадим мобильное приложение для управления списком клиентов в базе данных Northwind, которое может быть запущено на iOS либо Android.
Установка Android SDK
Для создания приложений под Android вы должны установить хотя бы один комплект средств разработки Android SDK. Установка Visual Studio для Mac по умолчанию уже включает один комплект Android SDK, однако зачастую это старая версия для поддержки наибольшего количества устройств Android. Для использования новейших возможностей Xamarin.Forms нужно установить более новую версию Android SDK.
Запустите Visual Studio для Mac и выполните команду Visual Studio Community → Preferences (Visual Studio Community → Настройки).
В диалоговом окне Preferences (Настройки) перейдите к разделу Projects → SDK Locations (Проекты → Расположение SDK) и выберите нужные платформы, например, Android 8.0 — Oreo (рис. 18.1).
![image](https://habrastorage.org/webt/_4/tv/b4/_4tvb4dgpffklsj8qlxh5c6q1vi.png)
Создание решения Xamarin.Forms
Выполните команду File → New Solution (Файл → Новое решение).
В открывшемся диалоговом окне выберите пункт App (Приложение) в категории Multiplatform (Кросс-платформенные проекты). В разделе Xamarin.Forms выберите пункт Blank Forms App (Пустое приложение Forms) (рис. 18.2).
![image](https://habrastorage.org/webt/xd/xb/et/xdxbetewmhwud6txjsh6p3wbqu4.png)
Нажмите кнопку Next (Далее).
В поле App Name (Имя приложения) введите текст NorthwindMobile, а в поле Organization Identifier (Идентификатор организации) — значение com.packt. Установите переключатель Shared Code (Общий код) в положение Use Shared Library (Использовать общую библиотеку) и активизируйте флажок Use XAML for the user interface files (Использовать XAML для файлов пользовательского интерфейса) (рис. 18.3).
Нажмите кнопку Next (Далее).
В поле Solution name (Имя решения) укажите значение Part3Mobile, а в поле Location (Расположение) — значение /Users/ваше_имя/Code (рис. 18.4). Нажмите кнопку Create (Создать). Через несколько мгновений будут созданы решение и три проекта. В Visual Studio для Mac выполните команду Build → Build All (Сборка → Собрать все) и дождитесь, когда программа загрузит все обновленные пакеты и соберет проекты (рис. 18.5).
Щелкните правой кнопкой мыши на решении Part3Mobile и выберите пункт Update NuGet Packages (Обновить пакеты NuGet).
![image](https://habrastorage.org/webt/xh/ca/of/xhcaofcsl1uvibdb_j453v7hu2q.png)
![image](https://habrastorage.org/webt/44/yu/fo/44yufo3l0rgx7zbi7mqom0mpw50.png)
![image](https://habrastorage.org/webt/2c/62/hg/2c62hgzp7ivf7wbgzqpfojfpz4w.png)
Создание модели
Мы могли бы воспользоваться созданной ранее библиотекой моделей данных с сущностями .NET Standard 2.0, но нам нужно реализовать двустороннюю привязку данных, поэтому мы создадим новый класс для представления сущностей клиентов в мобильном приложении.
Щелкните правой кнопкой мыши на проекте NorthwindMobile, в контекстном меню выполните команду Add → New Folder (Добавить → Новая папка) и присвойте созданному каталогу имя Models.
Щелкните правой кнопкой мыши на каталоге Models и в контекстном меню выполните команду Add → New File (Добавить → Новый файл).
В диалоговом окне New File (Новый файл) выполните команду General → Empty Class (General → Пустой класс), присвойте классу имя Customer (рис. 18.6) и нажмите кнопку New (Новый).
Измените инструкции, как показано в листинге ниже:
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace NorthwindMobile.Models
{
public class Customer : INotifyPropertyChanged
{
![image](https://habrastorage.org/webt/8r/jo/h1/8rjoh1ltpr_dp26ydopzw3ampas.png)
public static IList<Customer> Customers;
static Customer()
{
Customers = new ObservableCollection<Customer>();
}
public event PropertyChangedEventHandler PropertyChanged;
private string customerID;
private string companyName;
private string contactName;
private string city;
private string country;
private string phone;
public string CustomerID
{
get { return customerID; }
set
{
customerID = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs("CustomerID"));
}
}
public string CompanyName
{
get { return companyName; }
set
{
companyName = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs("CompanyName"));
}
}
public string ContactName
{
get { return contactName; }
set
{
contactName = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs("ContactName"));
}
}
public string City
{
get { return city; }
set
{
city = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs("City"));
}
}
public string Country
{
get { return country; }
set
{
country = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs("Country"));
}
}
public string Phone
{
get { return phone; }
set
{
phone = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs("Phone"));
}
}
public string Location
{
get
{
return string.Format("{0}, {1}", City, Country);
}
}
// для тестирования перед вызовом веб-сервиса
public static void SampleData()
{
Customers.Clear();
Customers.Add(new Customer
{
CustomerID = "ALFKI",
CompanyName = "Alfreds Futterkiste",
ContactName = "Maria Anders",
City = "Berlin",
Country = "Germany",
Phone = "030-0074321"
});
Customers.Add(new Customer
{
CustomerID = "FRANK",
CompanyName = "Frankenversand",
ContactName = "Peter Franken",
City = "München",
Country = "Germany",
Phone = "089-0877310"
});
Customers.Add(new Customer
{
CustomerID = "SEVES",
CompanyName = "Seven Seas Imports",
ContactName = "Hari Kumar",
City = "London",
Country = "UK",
Phone = "(171) 555-1717"
});
}
}
}
Обратите внимание на следующие моменты.
- Класс реализует INotifyPropertyChanged, поэтому компоненты пользовательского интерфейса с двусторонним связыванием, такие как Editor, будут обновлять свойство и наоборот. Все держится на событии PropertyChanged, которое возникает при изменении одного из свойств.
- После загрузки из сервиса данные о клиентах будут локально кэшироваться в мобильном приложении с помощью ObservableCollection. Это обеспечивает поддержку уведомлений для любых связанных компонентов пользовательского интерфейса, таких как ListView.
- Помимо свойств для сохранения значений, полученных из REST-сервиса, класс определяет свойство Location, установленное только для чтения. Оно будет служить для привязки в сводном списке клиентов.
- В целях тестирования, когда REST-сервис недоступен, применяется метод для использования данных трех демоклиентов.
Создание интерфейса для набора телефонных номеров
Щелкните правой кнопкой мыши на каталоге NorthwindMobile и в контекстном меню выполните команду Add → New File (Добавить → Новый файл).
В диалоговом окне New File (Новый файл) выполните команду General → Empty Interface (General → Пустой интерфейс), присвойте интерфейсу имя IDialer и нажмите кнопку New (Новый).
Измените код интерфейса IDialer, как показано в следующем листинге:
namespace NorthwindMobile
{
public interface IDialer
{
bool Dial(string number);
}
}
Реализация интерфейса для набора телефонных номеров под iOS
Щелкните правой кнопкой мыши на каталоге NorthwindMobile.iOS и в контекстном меню выполните команду Add → New File (Добавить → Новый файл).
В диалоговом окне New File (Новый файл) выполните команду General → Empty Class (General → Пустой класс), присвойте классу имя PhoneDialer и нажмите кнопку New (Новый).
Измените его содержимое, как показано в листинге, приведенном ниже:
using Foundation;
using NorthwindMobile.iOS;
using UIKit;
using Xamarin.Forms;
[assembly: Dependency(typeof(PhoneDialer))]
namespace NorthwindMobile.iOS
{
public class PhoneDialer : IDialer
{
public bool Dial(string number)
{
return UIApplication.SharedApplication.OpenUrl(
new NSUrl("tel:" + number));
}
}
}
Реализация интерфейса для набора телефонных номеров под Android
Щелкните правой кнопкой мыши на каталоге NorthwindMobile.Droid в контекстном меню и выполните команду Add—>New File (Добавить—>Новый файл).
В диалоговом окне New File (Новый файл) выполните команду General—>Empty Class (General—>Пустой класс), присвойте классу имя PhoneDialer и нажмите кнопку New (Новый).
Измените его содержимое, как показано в следующем листинге:
using Android.Content;
using Android.Telephony;
using NorthwindMobile.Droid;
using System.Linq;
using Xamarin.Forms;
using Uri = Android.Net.Uri;
[assembly: Dependency(typeof(PhoneDialer))]
namespace NorthwindMobile.Droid
{
public class PhoneDialer : IDialer
{
public bool Dial(string number)
{
var context = Forms.Context;
if (context == null)
return false;
var intent = new Intent(Intent.ActionCall);
intent.SetData(Uri.Parse("tel:" + number));
if (IsIntentAvailable(context, intent))
{
context.StartActivity(intent);
return true;
}
return false;
}
public static bool IsIntentAvailable(Context context, Intent intent)
{
var packageManager = context.PackageManager;
var list = packageManager.QueryIntentServices(intent, 0)
.Union(packageManager.QueryIntentActivities(intent, 0));
if (list.Any())
return true;
var manager = TelephonyManager.FromContext(context);
return manager.PhoneType != PhoneType.None;
}
}
}
В каталоге NorthwindMobile.Droid раскройте подкаталог Properties и откройте файл AndroidManifest.xml. В области Required permissions (Требуемые разрешения) установите флажок CallPhone (рис. 18.7).
![image](https://habrastorage.org/webt/wd/_p/ll/wd_pllpwrrfj6jryxrw8zytwi0g.png)
Об авторе
Марк Дж. Прайс (Mark J. Price) — обладатель сертификатов Microsoft Certified Solutions Developer (MCSD), Microsoft Specialist: Programming in C# и Episerver Certified Developer с более чем 20-летним опытом в области обучения и программирования.
С 1993 года Марк сдал свыше 80 экзаменов корпорации Microsoft по программированию и специализируется на подготовке других людей к успешному прохождению тестирования. Его студенты — как 16-летние новички, так и профессионалы с многолетним опытом. Марк ведет эффективные тренинги, сочетая образовательную деятельность с реальной практикой в консалтинге и проектировании систем для корпораций по всему миру.
В период с 2001 по 2003 год Марк посвящал все свое время разработке официального обучающего программного обеспечения в штаб-квартире Microsoft в американском городе Редмонд. В составе команды он написал первый обучающий курс по C#, когда была выпущена еще только альфа-версия языка. Во время сотрудничества с Microsoft он работал инструктором по повышению квалификации сертифицированных корпорацией специалистов на специальных тренингах, посвященных C# и .NET.
В настоящее время Марк разрабатывает и поддерживает обучающие курсы для системы Digital Experience Cloud компании Episerver, лучшей .NET CMS в сфере цифрового маркетинга и электронной коммерции.
В 2010 году Марк получил свидетельство об окончании последипломной программы обучения, дающее право на преподавание. Он преподает в Лондоне в двух средних школах математику старшеклассникам, готовящимся к получению сертификатов GCSE и A-Level. Кроме того, Марк получил сертификат Computer Science BSc. Hons. Degree в Бристольском университете (University of Bristol), Англия.
О рецензентах
Дастин Хеффрон (Dustin Heffron) — разработчик программного обеспечения и игр. Имеет более чем десятилетний опыт программирования на разных языках, восемь из которых связаны с C# и .NET.
В настоящее время разрабатывает программы для автоматизации и тестирования медицинских инструментов в компании Becton Dickinson. Кроме того, он соучредитель и генеральный директор компании SunFlake Studios.
Дастин уже долгое время сотрудничает с издательством Packt и принимал участие в работе над такими книгами, как XNA 4.0 Game Development by Example: Beginner’s Guide, C# 6 and .NET Core 1.0: Modern Cross-Platform Development, а также над серией видеоуроков XNA 3D Programming by Example. Кроме того, Дастин наряду с Ларри Луизианой (Larry Louisiana) выступает соавтором серии видеоуроков XNA 3D Toolkit.
Эфраим Кириакидис (Efraim Kyriakidis) — инженер-программист с более чем десятилетним опытом разработки и реализации программных решений для различных клиентов и проектов. Он хорошо разбирается во всех этапах цикла создания ПО. Его первое знакомство с компьютерами и программированием произошло в детстве, во времена популярности компьютера Commodore 64, в 80-х годах ХХ века. С тех пор он вырос и получил диплом в университете Аристотеля в Салониках (Aristotle University Thessaloniki), Греция. На протяжении своей карьеры работал в основном с технологиями Microsoft, используя C# и .NET, начиная с версии 1.0. В настоящее время трудится в корпорации Siemens AG в Германии разработчиком ПО.
» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 20% по купону — Packt