スマートフォンアプリケーション開発(2)
Androidアプリ
続いてAndroidアプリを見てみましょう。XamApp1.DroidプロジェクトのMainActivity.csをダブルクリックしソースコードを表示します。
using Android.App; using Android.OS; using Android.Widget; namespace XamApp1.Droid { [Activity(Label = "XamApp1", MainLauncher = true, Icon = "@mipmap/icon")] public class MainActivity : Activity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); Button button = FindViewById<Button>(Resource.Id.myButton); (略)
こちらもiOSと同じく、Javaを使ってAndroidアプリのコードを書いたことがある方であれば、ほとんどそのままであることがわかると思います。
- Android.AppやAndroid.OSを使用することを宣言する
- Activityクラスを継承してMainActivityを作成する
- アクティビティ作成時に呼ばれるOnCreateメソッドを実装する
- OnCreateメソッドの内容として、まず親クラスのOnCreateを呼び、SetContentViewでレイアウトリソースをセット、ボタンのインスタンスをIDから検索する
特にJavaとC#は構文自体が似ているので、ぱっと見ではJavaのコードかと勘違いしてしまうほどです。ただ、C#らしく名前空間名やメソッド名の1文字目が大文字になっている、FindViewByIdメソッドがジェネリックを使用して型キャストを不要にしている、といった違いがあります。
Javaでのイベントはリスナーを使って書きますが、Xamarin.Androidではイベントハンドラーメソッド(もしくはラムダ式)で記述します。MainActivity.csにも以下のようなラムダ式を使ったイベントハンドラーが記述されています。
button.Click += (sender, e) => { button.Text = $"{count++} clicks!"; };
もちろん、Androidのレイアウトファイル(.axml)の編集にも対応しています。これもソリューションエクスプローラーの.axmlファイルをダブルクリックすればデザイナーが表示されます。
インテリセンスやコードスニペットといったコーディング支援機能も、もちろんiOSと同様に使用できます。
ポータブルクラスライブラリ(PCL)
さて、ポータブルクラスライブラリ(PCL)は非常に強力な機能であるとすでに述べましたが、そのPCLについて紹介しましょう。
テンプレートで自動作成されたXamApp1プロジェクトはPCLプロジェクトです。PCLは文字通りポータブル(移植可能)なクラスライブラリのことで、PCLプロジェクトに含まれるクラスはXamarin.iOSとXamarin.Androidの両方から呼び出し可能となります。そのため、iOSとAndroidの両方で使用する機能をPCL内に実装すれば、iOS用とAndroid用に同じコードを書く必要がなくなります。
特にMVVM構成(Model-View-ViewModel)と組み合わせると非常に強力で、iOS、Androidプロジェクトにはデバイスに依存するビューを実装し、それ以外の部分(モデル・ビューモデル)はPCLプロジェクトに格納するようにすると、多くの部分を共通化することができます。MVVM Light ToolkitやMVVMCrossなどのMVVM支援ライブラリはすでにXamarinに対応しているので、これらを利用することも可能です。iOS版とAndroid版両方のアプリを作成する際、PCLは非常に大きなメリットとなります。
アプリの実行・デバッグ
iOSもAndroidも実機、もしくは、シミュレーターでアプリケーションを実行することができます。
画面上部で実行するプロジェクトやデバイスを選択し、実行ボタンをクリックすれば対象のデバイスでアプリが起動します。
iOSの場合、Xcode付属のiOSシミュレーターが使用されます。Xcodeでシミュレーターを追加すると、Visual Studio for Macでも使用できるようになります。実機のiOSデバイスもXcodeで認識できていれば、Visual Studio for Macでも選択できるようになります。
Androidの場合、Android SDK付属のAndroidエミュレーターが使用されます。Android SDKのAVD Managerでエミュレーターを追加しておくと、Visual Studio for Macでも使用できるようになります。実機のAndroidデバイスも接続方法はAndroid SDKを使用した場合と同じです。Windowsの場合は機種ごとにADB USBドライバーをインストールする必要がありますが、Macの場合はUSBで接続するだけでデバッグ可能になるようです(機種によって例外もあるかもしれません)。もちろん、Androidデバイス側の[設定]-[開発者向けオプション]をオンにし、USBデバッグを許可、[セキュリティ]の提供元不明のアプリケーションのインストールを許可といった設定は必要です。
デバッグ中はブレークポイントの設定や変数値の確認・変更など、デバッグ作業に必要なさまざまな操作をおこなうことができます。
上図はボタンのクリックイベントの中にブレークポイントをセットし、ローカル変数やプライベート変数の値を表示しているところです。表示だけでなく値の変更も可能です。イミディエイトウィンドウでは「count += 5」のようなC#の式を使って変数の値を変更したり、「count.ToString("x")」のようにメソッド呼び出しを実行したりすることも可能です(ToString("x")は16進数表記で文字列化です)。
なお、Xamarinアプリケーションは基本的にネイティブアプリケーションです。Xamarin.iOSではデプロイ前にコンパイルされて完全なネイティブアプリケーションになります。Xamarin.AndroidではAndroid OS上に.NETランタイムとJavaランタイムが横並びの関係で動作しています。