Xamarin逆引きTips
Xamarin.iOS/Androidでソースコードを共有するには?(リンクファイル編)
Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、Xamarin Studioのプロジェクト内でソースファイルへのリンクを追加する方法を説明する。
Xamarin.iOS/Androidでソースコードを共有する手法はいくつかあるが、今回は最も原始的な「リンクによるソースファイルの共有」について解説する。
1. シナリオ
簡単な計算を行うアプリケーション「CalcSample」として、Xamarin.iOSプロジェクトの「CalcSample.iOS」と、Xamarin.Androidプロジェクトの「CalcSample.Android」を作成する。このアプリケーションの計算処理は、iOSとAndroidで同一なので、図1に示すように、そのソースファイルCalc.cs
を両者で共有したい。
2. CalcSample.iOSプロジェクトを作成する
まずCalcSampleソリューションと、CalcSample.iOSプロジェクトを作成する。
メニューバーの[ファイル]-[新規]-[ソリューション]から表示したダイアログで、[C#]-[iOS]-[Classic API]-[iPhone]-[Single View Application]を選択し、プロジェクト名を「CalcSample.iOS」、ソリューション名を「CalcSample」として[OK]ボタンを押す。
次に、MainStoryboard.storyboard
ファイルを開いて、図3のようにUITextField
を2つ、UIButton
、UILabel
を1つずつ配置する。identifierは左から、editNumberA
、editNumberB
、buttonCalc
、labelResult
とする。
画面で見ての通り、2つの数値を足し算して合計を表示するだけの簡単なアプリケーションだ。次に、この計算処理を行うCalc
クラスを、以下の手順で追加する。
CalcSample.iOSプロジェクトをマウスで右クリックし、[追加]-[新しいファイル]で表示されるダイアログボックスで、[General]-[空のクラス]を選択し、ファイル名をCalc.cs
として[新規](New)ボタンを押す。
Calc.cs
ファイルは以下のように実装する。Add
メソッドで2つの数値を足し算して返すだけだ。
using System;
namespace CalcSample.Core
{
public class Calc
{
public int Add(int numberA, int numberB)
{
return numberA + numberB;
}
}
}
|
新規作成したクラスは、名前空間がCalcSample.iOS
となっているが、共通で使用するファイルとしてはふさわしくないので、CalcSample.Core
としている。
次に、SampleCalc.iOSViewController.cs
ファイルで、buttonCalc
を押したときに、Calc
クラスを使って計算をさせ、結果を表示する実装を以下のように行う。
……省略……
using CalcSample.Core;
namespace CalcSample.iOS
{
public partial class CalcSample_iOSViewController : UIViewController
{
……省略……
public override void ViewDidLoad()
{
base.ViewDidLoad();
buttonCalc.TouchUpInside += (sender, e) =>
{
var calc = new Calc();
labelResult.Text = calc.Add(
Convert.ToInt32(editNumberA.Text),
Convert.ToInt32(editNumberB.Text)).ToString();
};
}
……省略……
}
}
|
ここまでのプログラムを実行すると、図4のようになる。
3. CalcSample.Androidを作成する
続いて、CalcSample.Androidプロジェクトを作成する。
ソリューションをマウスで右クリックし、[追加]-[新しいプロジェクトを追加]を選択して表示されるダイアログボックス(図5参照)で、[C#]-[Android]-[Android Ice Cream Sandwich Application]を選択し、プロジェクト名を「CalcSample.Android」として[OK]ボタンを押す。
次に、Main.axml
ファイルを開いて、下記コードのようにUIをレイアウトする。iOS版と同じく、EditBox
を2つ、Button
、TextView
を1つずつ配置する。idは左から、editNumberA
、editNumberB
、buttonCalc
、labelResult
とする。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp">
<EditText
android:id="@+id/editNumberA"
android:text="2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/editNumberB"
android:text="3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp" />
<Button
android:id="@+id/buttonCalc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:text="Calc" />
<TextView
android:id="@+id/labelResult"
android:text="Result"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
|
Main.axml
ファイルをUIデザイナーで開くと図6のようになる。
4. Calc.csファイルを共有する
Android版の計算処理は、iOS版で作成したCalc.cs
ファイルをそのまま使用する。以下の手順で、Calc.cs
をCalcSample.Android
プロジェクトに追加する。
CalcSample.Androidプロジェクトをマウスで右クリックし、[追加]-[ファイルを追加]で表示されるダイアログボックス(図7参照)で、CalcSample.iOSディレクトリにあるCalc.cs
ファイルを選択して[Open](開く)ボタンを押す。すると図8のダイアログボックスが表示されるので、[Add a link to the file](ファイルにリンクを追加)を選択して[OK]ボタンを押す。
これでCalcSample.Androidプロジェクトに、Calc.cs
ファイルへの「リンク」が追加された。プロジェクトのツリーを見ると、Calc.cs
のアイコンが他とは少し違う、鎖の付いたものになっているのが分かるだろう(図9)。これは、「プロジェクトにはファイルの実体は持っておらず、別の場所にあるファイルの参照のみを保持している」という意味だ(図8の選択肢で他の項目を選べば、プロジェクトに実体を移動またはコピーすることもできる)。
あとはiOS版と同様、MainActivity.cs
ファイルで、buttonCalc
を押したときの処理を以下のように実装する。
……省略……
using CalcSample.Core;
namespace CalcSample.Android
{
[Activity(Label = "CalcSample.Android", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
……省略……
var editNumberA = FindViewById<EditText>(Resource.Id.editNumberA);
var editNumberB = FindViewById<EditText>(Resource.Id.editNumberB);
var labelResult = FindViewById<TextView>(Resource.Id.labelResult);
FindViewById<Button>(Resource.Id.buttonCalc).Click += (sender, e) =>
{
var calc = new Calc();
labelResult.Text = calc.Add(
Convert.ToInt32(editNumberA.Text),
Convert.ToInt32(editNumberB.Text)).ToString();
};
}
}
}
|
ここまでのプログラムを実行すると、図10のようになる。
まとめ
「リンクによるソースファイルの共有」について解説した。この手法は、「Sharing Code Options | Xamarin(英語)」の「Shared Projects」で使われている方式だ。簡単に実現できるが、単なるファイルの共有なので、片方でプラットフォームに依存したコードを書くと、もう片方ではビルドエラーになってしまう。それを回避するための#if PLATFORM
ディレクティブも存在するが、多用するとソースコードが複雑になる。また、プロジェクト外のファイルを参照するので、ファイル管理の面でも注意が必要だ。
【コラム】Xamarin Android Player
図10はXamarin Android Playerという、Android SDK標準のエミュレーターより高速に動作するAndroidシミュレータだ。Evolve 2014で発表された新機能の1つで、現在はプレビュー版ながらXamarinのライセンスがあれば使用できる。VirtualBoxを用いているなど、テクノロジ的にはGenymotionに近いが、Xamarin Studioと親和性が高く、連携した機能も搭載されている(例:プロジェクトを実行すると、Android Playerが自動的に前面に表示されるなど)ので、正式リリースに期待したい。
※以下では、本稿の前後を合わせて5回分(第24回~第28回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
24. Xamarin Studio で画面を分割するには?(ショートカットキー情報あり)[Mac&Win対応]
Xamarin Studioの新機能として、コードエディターを左右の領域に分割して表示できるようになった。マウスとショートカットキーによる操作方法を説明する。
25. Xamarin.iOS/Androidでログを出力するには?
Xamarin.AndroidでネイティブAndroidのLogクラスを使ってログ出力する方法と、Xamarin.iOS/Androidで.NET基本クラスライブラリ機能を使ってログ出力する方法を解説する。
26. 【現在、表示中】≫ Xamarin.iOS/Androidでソースコードを共有するには?(リンクファイル編)
Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、Xamarin Studioのプロジェクト内でソースファイルへのリンクを追加する方法を説明する。
27. Xamarin.iOS/Androidでソースコードを共有するには(ポータブルクラスライブラリ編)
Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、複数のプロジェクトから共通のポータブルクラスライブラリ(PCL)を参照する方法を説明する。
28. Xamarin.iOS/AndroidでJSONを扱うには?(Json.NET使用)
Web APIにおけるデータフォーマットの定番になっているJSONを、Xamarin.iOS/Androidで扱うには? 「Json.NET」というライブラリを使う方法を説明する。