Xamarin逆引きTips

Xamarin逆引きTips

Xamarin.iOS/Androidでソースコードを共有するには?(リンクファイル編)

2014年11月12日

Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、Xamarin Studioのプロジェクト内でソースファイルへのリンクを追加する方法を説明する。

奥山 裕紳(@amay077
  • このエントリーをはてなブックマークに追加

 Xamarin.iOS/Androidでソースコードを共有する手法はいくつかあるが、今回は最も原始的な「リンクによるソースファイルの共有」について解説する。

1. シナリオ

 簡単な計算を行うアプリケーション「CalcSample」として、Xamarin.iOSプロジェクトの「CalcSample.iOS」と、Xamarin.Androidプロジェクトの「CalcSample.Android」を作成する。このアプリケーションの計算処理は、iOSとAndroidで同一なので、図1に示すように、そのソースファイルCalc.csを両者で共有したい。

図1 「CalcSample」における共有のイメージ

2. CalcSample.iOSプロジェクトを作成する

 まずCalcSampleソリューションと、CalcSample.iOSプロジェクトを作成する。

 メニューバーの[ファイル]-[新規]-[ソリューション]から表示したダイアログで、[C#]-[iOS]-[Classic API]-[iPhone]-[Single View Application]を選択し、プロジェクト名を「CalcSample.iOS」、ソリューション名を「CalcSample」として[OK]ボタンを押す。

図2 ソリューションとiOSプロジェクトの作成

 次に、MainStoryboard.storyboardファイルを開いて、図3のようにUITextFieldを2つ、UIButtonUILabelを1つずつ配置する。identifierは左から、editNumberAeditNumberBbuttonCalclabelResultとする。

図3 CalcSample.iOSの画面レイアウト(MainStoryboard.storyboard)

 画面で見ての通り、2つの数値を足し算して合計を表示するだけの簡単なアプリケーションだ。次に、この計算処理を行うCalcクラスを、以下の手順で追加する。

 CalcSample.iOSプロジェクトをマウスで右クリックし、[追加]-[新しいファイル]で表示されるダイアログボックスで、[General]-[空のクラス]を選択し、ファイル名をCalc.csとして[新規](New)ボタンを押す。

 Calc.csファイルは以下のように実装する。Addメソッドで2つの数値を足し算して返すだけだ。

C#
using System;

namespace CalcSample.Core
{
  public class Calc
  {
    public int Add(int numberA, int numberB)
    {
      return numberA + numberB;
    }
  }
}
リンク共有するソースファイル(Calc.cs)

 新規作成したクラスは、名前空間がCalcSample.iOSとなっているが、共通で使用するファイルとしてはふさわしくないので、CalcSample.Coreとしている。

 次に、SampleCalc.iOSViewController.csファイルで、buttonCalcを押したときに、Calcクラスを使って計算をさせ、結果を表示する実装を以下のように行う。

C#
……省略……
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();
      };
    }

    ……省略……
  }
}
Xamarin.iOSプロジェクト内でCalcクラスを使うコード(SampleCalc.iOSViewController.cs)

 ここまでのプログラムを実行すると、図4のようになる。

図4 CalcSample.iOSの実行画面
図4 CalcSample.iOSの実行画面

3. CalcSample.Androidを作成する

 続いて、CalcSample.Androidプロジェクトを作成する。

 ソリューションをマウスで右クリックし、[追加]-[新しいプロジェクトを追加]を選択して表示されるダイアログボックス(図5参照)で、[C#]-[Android]-[Android Ice Cream Sandwich Application]を選択し、プロジェクト名を「CalcSample.Android」として[OK]ボタンを押す。

図5 Androidプロジェクトの作成

 次に、Main.axmlファイルを開いて、下記コードのようにUIをレイアウトする。iOS版と同じく、EditBoxを2つ、ButtonTextViewを1つずつ配置する。idは左から、editNumberAeditNumberBbuttonCalclabelResultとする。

AXML
<?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>
CalcSample.Androidの画面レイアウト(Main.axml)

 Main.axmlファイルをUIデザイナーで開くと図6のようになる。

図6 CalcSample.Androidの画面レイアウト

4. Calc.csファイルを共有する

 Android版の計算処理は、iOS版で作成したCalc.csファイルをそのまま使用する。以下の手順で、Calc.csCalcSample.Androidプロジェクトに追加する。

 CalcSample.Androidプロジェクトをマウスで右クリックし、[追加]-[ファイルを追加]で表示されるダイアログボックス(図7参照)で、CalcSample.iOSディレクトリにあるCalc.csファイルを選択して[Open](開く)ボタンを押す。すると図8のダイアログボックスが表示されるので、[Add a link to the file](ファイルにリンクを追加)を選択して[OK]ボタンを押す。

図7 プロジェクトへのファイルの追加ダイアログボックス
図8 プロジェクト外のファイルを追加するときに表示されるダイアログボックス
図8 プロジェクト外のファイルを追加するときに表示されるダイアログボックス

 これでCalcSample.Androidプロジェクトに、Calc.csファイルへの「リンク」が追加された。プロジェクトのツリーを見ると、Calc.csのアイコンが他とは少し違う、鎖の付いたものになっているのが分かるだろう(図9)。これは、「プロジェクトにはファイルの実体は持っておらず、別の場所にあるファイルの参照のみを保持している」という意味だ(図8の選択肢で他の項目を選べば、プロジェクトに実体を移動またはコピーすることもできる)。

図9 Calc.csファイルへのリンクを追加したプロジェクトツリー

 あとはiOS版と同様、MainActivity.csファイルで、buttonCalcを押したときの処理を以下のように実装する。

C#
……省略……
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();
      };
    }
  }
}
Xamarin.Androidプロジェクト内でCalcクラスを使うコード(MainActivity.cs)

 ここまでのプログラムを実行すると、図10のようになる。

図10 CalcSample.Androidの実行画面
図10 CalcSample.Androidの実行画面

まとめ

 「リンクによるソースファイルの共有」について解説した。この手法は、「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」というライブラリを使う方法を説明する。

イベント情報(メディアスポンサーです)

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • グレープシティ株式会社
  • 日本マイクロソフト株式会社