[Xamarin.Android] F# と C# で生成されるクラス名が違う

 F#C#リソース ID を保持するクラスのクラス名/ネームスペースが異なります。
 C# では Resource クラスの public な内部クラスとして Drawable クラスや String クラスが作成されました。
 F# では Resource_Drawable クラスや Resource_String クラスが作成されます。
 
 使用する際は、C#. だった部分を F# では _ に置き換えるだけです。

広告

Visaul Studio Emulator for Android で電話機能をデバッグしようとするとメッセージが表示される

 Visual Studio Emulator for Android で電話機能をデバッグしようとすると、次のエラーが発生します。

To Place a call, first turn off Airplane mode.

または

機内モードをOFFにしてから発信してください。

 メッセージの内容に従って機内モードをOFFにしても変わりませんし、そもそもOFFが初期状態です。
 これは、エミュレーターで実行できない機能のためこうなっているようです。
 

■ 対処

 そもそもエミュレーターで実行できない機能です。
 デバッグが必要であれば実機を使用するのが良いでしょう。

Visual Studio で F# プロジェクトがエラーで開けなくなった

 Visual StudioF#Xamarin.Android プロジェクトを扱っている際に、次のエラーが表示され、プロジェクトが開けなくなることがありました。

プロジェクト ‘XXXXXXXXXX.fsproj’ を開くと、ソリューション エクスプローラー内でフォルダーが複数回表示されるため、このプロジェクトを開けませんでした。この問題がある項目の 1 つは ‘XXXXXXXXXX\XXXXXXXXXX\XXXXXXXXXX.XXX’ です。このプロジェクトを Visual Studio で開くには、プロジェクト ファイルを編集して問題を解決してください。

または

The project ‘XXXXXXXXXX.fsproj’ could not be opened because opening it would cause a folder to be rendered multiple times in the solution explorer. One such problematic item is ‘XXXXXXXXXX\XXXXXXXXXX\XXXXXXXXXX.XXX’. To open this project in Visual Studio, first edit the project file and fix the problem.

 これは、.fsproj ファイルが正しく設定されなかった場合に発生します。
 ソリューションにファイルを追加した際に発生しました。

■ 対処

 .fsproj を開いて編集します。
 同じフォルダ内のファイルは、間に別のフォルダのファイルをはさむことなく続けて書かれているようにします。

  <ItemGroup>
    <AndroidResource Include="Resources\layout\Tabbar.axml" />
    <AndroidResource Include="Resources\values\styles.xml" />
    <AndroidResource Include="Resources\layout\Toolbar.axml" />

 のようになっている場合、次のようにします。

  <ItemGroup>
    <AndroidResource Include="Resources\values\styles.xml" />
    <AndroidResource Include="Resources\layout\Tabbar.axml" />
    <AndroidResource Include="Resources\layout\Toolbar.axml" />

 これでプロジェクトを開けるようになりました。

xaml ファイルを手で追加する

 Xamarin.Forms では通常、例えば C# でプロジェクトを作っていれば、新規作成から Forms ContentView Xaml などを選択すれば良いので意識することはないと思います。
 しかし、中にはその選択肢のない環境もないわけではありません。
 ※例えば、Visual Studio + F#
 そういった場合、Xaml ファイルを温かみのある手作りするのですが、作成したファイルに次の設定が必要です。

■ 設定

 ビルド アクション を「埋め込みリソース」(Embedded Resource)に設定

.Andriod プロジェクトを Forms プロジェクトにしようとしたら Unhandled Exception

 .Android プロジェクトとして新規作成したプロジェクトを Forms プロジェクトにしようとした際に実行時に次のエラーが発生することがありました。

Unhandled Exception:

Java.Lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. occurred

 Forms アプリでは、MainActivityForms 用の Activity スーパークラスのサブクラスとしなければなりませんが、そこでミスをしていました。
 対処方法は 2 種類あります。

■ Xamarin.Forms.Platform.Android.FormsApplicationActivity をスーパークラスにする

 上記エラーは、Xamarin.Forms.Platform.Android.FormsAppCompatActivity をスーパークラスとしながら設定が不足している場合に発生します。
 そこで、FormsApplicationActivity クラスをスーパークラスとすれば、発生しなくなります。F#Forms のソリューションを作成した場合はこちらが使用されています。
 

■ FormsAppCompatActivity のまま設定を追加する

 こちらは C# で新規作成した場合に合わせる方針です。
 ※この方法だと F# プロジェクトの場合、Xamarin Studio でエラーが出ました。
 まず、MainActivity の属性に次を追加します。

, Theme = "@style/MainTheme"

 続いて、 Resources/values フォルダーに style.xml を追加します。
 最低限次の記述があれば動作します。

<?xml version="1.0" encoding="utf-8" ?>
<resources>

  <style name="MainTheme" parent="MainTheme.Base">
  </style>

  <style name="MainTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="windowNoTitle">true</item>
  </style>

</resources>

 これでデバッグ実行できるようになりました。

デバッグ実行がすぐに終了してしまう

 Visual Studio でアプリをデバッグ実行しようとしても一瞬緑の右三角が灰色になるが直ぐに終了してしまうことがあります。
出力には

Project not selected to build for this solution configuration

または

プロジェクトはこのソリューション構成に対してビルドするように選択されていません。

と表示されていて、Xamarin でテンプレートからソリューションを作成 しなかった 場合に出会いました。
 

■ 対処

ビルド > 構成マネージャー
.Android プロジェクトの [配置] にチェックを ON
XamarinAndroid プロジェクトを実行する場合
 
 これでデバッグ実行できるようになりました。

Xamarin.Android で実行するエミュレーターを選択できない

 Visual Studio 2017Xamarin.AndroidF# プロジェクトを作成すると、デバッグ実行するエミュレーターを選択できないことがあります。
 というか私の環境では 100% 選択できないタイミングがあります。
 

■ 再現手順

 Visual StudioF#Xamarin.Android プロジェクトを新規作成します。
 

■ 現象

 デバッグの実行ターゲットが「 |> Start 」しか選択肢が現れず、エミュレーターを選択できません。
 
 その場合に、Start を選択しても、デバッグ実行は可能です。ただし、エミュレーターは選択できないので何らかの順序で決まったエミュレーターで実行されます。
 私の環境では、Google Android エミュレーターVisual Studio エミュレーター for Android がインストール/設定されているのですが、Google Android エミュレーターで実行されました。

 ※上記2種のエミュレーターの動作環境は排他です。私の環境は Visual Studio エミュレーター が動く環境です。そのため実際には Google Android エミュレーターを実行しようとして失敗します。
 

■ 対策

 一度、ソリューションを閉じて開きなおします。
 それで、実行ターゲットの選択肢が正常に表示されます。
 

■ おすすめ設定

 F# + Xamarin.Android をやるなら Visual Studio はいったん置いておいて、Xamarin Studio で開発するとはかどりそうです。