Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
Xamarin for Visual Studio概説(後編)

Xamarin for Visual Studio概説(後編)

Visual StudioでiOS/Androidアプリが書けるXamarinを試してみた(Android編)

2013年12月6日

iOS編の続編。Visual Studioで基礎的なAndroidアプリのプロジェクトを作成し、生成されるファイル群を説明。エミュレーターでアプリを実行して、Visual Studioでデバッグしてみる。

デジタルアドバンテージ 一色 政彦
  • このエントリーをはてなブックマークに追加

 前編(iOS編)では、Windows上のVisual Studioを使ってiOS/Androidアプリを開発・デバッグできる「Xamarin for Visual Studio」で特に気になるポイントを説明し、実際にiOSアプリ開発を試してみた。本稿はその続編で、実際にAndroidアプリの開発を試してみる。

 iOSアプリ開発の内容と比較しやすいように、できるだけ前編と同じ構成で執筆するように心掛けた。また、今回もスクリーンキャプチャを多用しており、画像とコードを追うだけでも大体の開発手順がつかめるようにしているので、全文を読む時間がない場合は、取りあえず画像とコードだけでもザッと眺めてほしい。

初めてのAndroidアプリ開発

 それではさっそくAndroidアプリの開発手順から見ていこう。前編の手順で、Xamarinがインストール済みであることを前提とする。開発環境は、Visual Studio Ultimate 2013である。

Android関連のプロジェクトテンプレート

 Visual Studioの[新規プロジェクト]ダイアログを開くと、左側ツリーの[Visual C#]の配下に[Android]というカテゴリが追加されている(次の画面)。

Android関連のプロジェクトテンプレート

 [Android]に含まれるプロジェクトテンプレートは以下のとおりだ([iOS]とは異なり、サブフォルダーは存在しない)。

[Android]

  • Android Application: Xamarin.Androidアプリケーション作成用のプロジェクト(Froyo(API Level 8)以上のデバイスで動作する設定でプロジェクトが作成される)
  • Android Honeycomb Application: Honeycomb(API Level 12)以上のデバイスで動作するXamarin.Androidアプリケーション作成用のプロジェクト
  • Android Ice Cream Sandwich Application: Ice Cream Sandwich(API Level 15)以上のデバイスで動作するXamarin.Androidアプリケーション作成用のプロジェクト
  • Android OpenGL Application: OpenGLベースのXamarin.Androidアプリケーション作成用のプロジェクト
  • Android Class Library: Xamarin.Androidクラスライブラリ作成用のプロジェクト
  • Java Bindings Library: Android/Java jarとバインドするXamarin.Androidクラスライブラリ作成用のプロジェクト

 ここでは、最も基本的な「Android Application」テンプレートでプロジェクトを新規作成してみることにしよう(プロジェクト名は「HelloAndroidWorld」とした)。

[Android]向け「Android Application」のひな型ファイル群

 プロジェクト作成時に自動生成されるファイル群を見てみよう。[ソリューション エクスプローラー]の中は、次の画像のような内容になった。

[Android]向け「Android Application」のひな型ファイル群
[Android]向け「Android Application」のひな型ファイル群

 それぞれのファイル内容について簡単に説明しよう(C#で開発する方が本稿の読者の大半だと思われるが、.NET開発者以外にも分かるように、.NET関連の基本的なファイルについても簡単に説明しておく。一部は、iOS編と同じ説明)。

[Properties]フォルダー
  • AssemblyInfo.cs: .NETではビルド後のファイルを「アセンブリ(Assembly)」と呼ぶが、そのアセンブリに付加する情報を記載するためのファイル
  • AndroidManifest.xml:

 Androidアプリに関するマニフェスト情報(アプリケーション名やバージョンなど)を記述するファイル(Android開発では必須のファイルで、Xamarin独自のものではない)。[Properties]フォルダーをダブルクリックすると、プロジェクトプロパティが開かれ、その[Android Manifest]タブで次の画面のように各マニフェスト情報をGUIで入力できる。

AndroidManifest.xmlファイルのGUI設定

 その他、コンパイル対象のAndroidバージョンや、Android関連のビルドや実行などの各種プロジェクト設定も、このプロジェクトプロパティで行える(次の画面)。

Androidアプリに関するプロジェクト設定
[References]フォルダー
  • Mono.Android: Xamarin.Android用のアセンブリへの参照(=そのアセンブリに含まれるクラスやメソッドを使うための指定)
  • mscorlib/System/System.Core/System.Xml/System.Xml.Linq: .NETの基本機能を含むアセンブリ。厳密には.NETではなく、Xamarin独自の.NET互換のMonoのアセンブリになっている
[Components]フォルダー

 iOSアプリ開発と同じように、ひな型では空になっている。Xamarinコンポーネントストアから必要なコンポーネント(無料/有料)を導入できる。次の画面は、Visual Studio上でコンポーネントを追加するダイアログを表示したところだ。

Visual Studioから起動したXamarinコンポーネントストアのダイアログ
[Assets]フォルダー

 Androidアプリ用のアセット(Assets)を配置する。アセットとは、パッケージと一緒に配置されるファイル群のことで、プログラム内からそのアセットファイルを読み出すことができる。例えばプログラム内で動的に読み込みたい画像ファイルなどは、ここに配置すればよい([プロパティ]ウィンドウでファイルの[ビルド アクション]を「AndroidAsset」に指定する必要がある)。ちなみに「AboutAssets.txt」というファイルが最初から作成されているが、アセットファイルを読み出すコード例などが記載されている説明用のファイルである。

[Resources]フォルダー

 Androidアプリ用のアイコン画像/文字列値/画面レイアウト定義などのリソースファイルが配置されている([プロパティ]ウィンドウでファイルの[ビルド アクション]を「AndroidResource」に指定する必要がある)。ちなみに「AboutResources.txt」ファイルは、リソースにアクセスする方法などが記述されている説明用のファイルである。

  • [Drawable]フォルダー:

 ここにアイコン画像ファイルを配置する。ひな型では「Icon.png」ファイルが配置されているが、これにアクセスするには、「@drawable/Icon」と指定すればよい(後述)。

  • [Values]フォルダー:

 文字列値リソース(XMLファイル)を配置する。ちなみに、[Resources]フォルダー内に[Values-ja]フォルダー(「-ja」のように言語名を指定)を新規作成して、その中に日本語用の文字列リソースを配置するという手法で、多言語対応も行える。ひな型では「Strings.xml」ファイル(次のコード)が配置されており、この中の例えば「Hello」という名前の文字列値にアクセスするには、「@string/Hello」と指定すればよい(後述)。

XML
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="Hello">Hello World, Click Me!</string>
  <string name="ApplicationName">HelloAndroidWorld</string>
</resources>
Strings.xmlファイルのコード内容
  • [Layout]フォルダー:

 レイアウト定義用の.axmlファイルを配置する。ひな型として生成されている「Main.axml」ファイルは、メイン画面のレイアウト定義である(後述するが「Resource.Layout.Main」というコードで指定される)。これをダブルクリックすると、.axmlファイルをGUIで編集できる「Androidデザイナー」(次の画面)が立ち上がる。(この画面の例では左側にある)[ツールボックス(Toolbox)]からドラッグ&ドロップでコントロールを配置して、(右下にある)[プロパティ(Properties)]ウィンドウで各コントロールなどの各プロパティ値を指定できる。

レイアウト定義用の.axmlファイルをグラフィカルに編集できるAndroidデザイナー

 上のAndroidデザイナー上では、Buttonコントロールが1つだけ配置されており、そのtextプロパティに「@string/Hello」が指定されているが、これは前述したリソースの文字列値を表す。

 ちなみに、Main.axmlファイルをテキストエディターで開くと、次のようなコードになっている。

AXML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
<Button
  android:id="@+id/MyButton"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="@string/Hello"
  />
</LinearLayout>
Main.axmlファイルのコード内容
  • Resource.Designer.cs: 上記の3つのフォルダー内に生成されたリソースにアクセスするためのクラスが、このファイルに自動生成される(手動による編集不可)

Activity1.cs

 これが、アプリのソースファイルである。そのコード内容は次のとおり。

C#
using Android.App;
using Android.OS;
using Android.Widget;

namespace HelloAndroidWorld
{
  [Activity(Label = "HelloAndroidWorld", MainLauncher = true, Icon = "@drawable/icon")]
  public class Activity1 : Activity
  {
    int count = 1;

    protected override void OnCreate(Bundle bundle)
    {
      base.OnCreate(bundle);

      // リソースの「Main」レイアウト画面をビューに設定
      SetContentView(Resource.Layout.Main);

      // レイアウトリソースからボタンを取得
      Button button = FindViewById<Button>(Resource.Id.MyButton);

      // ボタンにイベントをアタッチする
      button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };
    }
  }
}
Activity1.csファイルのコード内容(一部翻訳)

 Androidアプリでは、アプリ全体におけるエントリーポイント(いわゆるMainメソッド)は用意されていない。その代わりに、「アクティビティ(Activity)」が実行される。上記のコード例では、Activityクラス(Android.App名前空間)を継承したActivity1クラス(HelloAndroidWorld名前空間)が、そのアクティビティに該当する。

 Activity1クラスには、Activity属性(Android.App名前空間)が付与され、その引数として、「HelloAndroidWorld」というラベル、「このクラスが起動用のメインアクティビティ(MainLauncher)であること」、さらにアイコンとして前述の画像リソースが指定されている(「Icon」の「I」が小文字だが、これはどちらでもよいようだ)。

 アクティビティが起動されるとき、アクティビティクラスのOnCreateメソッドが呼び出される。上記のコードでもこのメソッドがオーバーライドされて実装されており、その中で「SetContentView(Resource.Layout.Main)」というコードにより、前述のレイアウト定義(Main.axml)をコンテンツビューとして設定している。このようにOnCreateメソッドの中で、アクティビティに対して、アプリ画面をマップできる。

 さらに、「FindViewById<Button>(Resource.Id.MyButton)」というコードで、レイアウトリソース内に定義されていたボタンを取得している。

 「button.Click」というコード部分は、Clickイベントが発生したときに(=ボタンがタッチされたときに)、ボタンのタイトルを「"<タッチ回数> clicks!」という表示に変える処理が記述されている。そのため、このアプリを実行すると、ボタンをタップするたびに、そのタッチ回数が表示されることになる。

 以上、このAndroidアプリのプロジェクト内容や、アプリの挙動を一通り説明した。

Visual Studioから、初めてのAndroidアプリのデバッグ

 それでは最後に、「Visual StudioからのAndroidアプリのデバッグ」を試してみよう。

 通常どおり、デバッグを開始すると、Android Emulator(エミュレーター)が自動起動して(起動前に「エミュレーターの動作が遅いが、このまま進めるか?」という趣旨の質問ダイアログが表示されるので[はい]をクリック)、その中でデバッグ対象のAndroidアプリが自動的に立ち上がる(待ち受け画面は自分で開かなければならない)。次の画面はその例だ。

Android Emulatorで実行されたデバッグ中のAndroidアプリ

 もちろん、Visual Studio上でブレークポイントを設定してデバッグを中断し、ステップ実行したり、変数の値を調べたりできる。

 以上、Xamarin for Visual Studioで実際にAndroidアプリ開発を試してみた。

 JavaやObjective-C言語でスマホアプリ開発を始めるのに、何となくちゅうちょしてしまうという場合は、慣れ親しんだC#とVisual Studioで取りあえず開発を試してみて、iOS/Androidアプリの開発に慣れてしまうという方法もありだと筆者は感じた。確かにXamarin for Visual Studioのライセンスは、10万円程度(iOSとAndroidの両方だと20万円程度)と高額だ。これをすぐに払うのは難しいかもしれない。まずは30日間の試用期間で、C#を使ってiOS/Androidアプリ開発のコツをつかみ、その後は純正のObjective-C/Java開発に移行するか、ライセンス料を払ってマルチプラットフォーム対応で開発することのメリットやVisual Studio開発の快適さを選択するかを検討してみてもよいだろう。本稿がその一助になれば幸いである。

【関連記事】:
  「.NET互換環境
  ・ディープなXamarin技術情報の連載記事「インサイドXamarin」 )

Xamarin for Visual Studio概説(後編)
1. Visual StudioでiOS/Androidアプリが書けるXamarinを試してみた(iOS編)

新登場のXamarin for Visual Studioとは? 「iOSのネイティブアプリをWindows上で作るって、どういうこと?」という疑問に答え、実際にiOSアプリ開発を試してみる。

Xamarin for Visual Studio概説(後編)
2. 【現在、表示中】≫ Visual StudioでiOS/Androidアプリが書けるXamarinを試してみた(Android編)

iOS編の続編。Visual Studioで基礎的なAndroidアプリのプロジェクトを作成し、生成されるファイル群を説明。エミュレーターでアプリを実行して、Visual Studioでデバッグしてみる。

サイトからのお知らせ

Twitterでつぶやこう!