前回、エラー出まくりながらもXamarinの環境構築が何とか完了しました。
PCLはまだまだ問題ありですが、Android単体なら何とかなりそうなので、下記のサイトを参照して、Android用の簡単なサンプルを作成してみました。
sys-guard.com
まずはVSを起動して、プロジェクトから[Visual C#]]-[Android]-[Blank App(Android)]を選択。
現在Android(というかJava)を絶賛勉強中ということもあり、とりあえずソースはAndroid Studioで作成したものをそのままコピペして、いきなりビルド。
こいつ…動かないぞ!(当たり前)
まあ、そのままでは動きませんので、修正を。
とはいえ、まだまだソースの細かい部分を一から説明すると大変なので、現時点ではとりあえず感じたことを。
- 基本的なクラスとかコントロールは、デフォルトでインポートされてるもので大丈夫っぽい。(今回個別に追加したのは「Android.Graphics」のみです。またヒントに結構「この名前空間のこのクラスを使え」って直に表示されます。)
- プロパティ・メソッド名は同じものが多く、せいぜい大文字・小文字の違いのみ。(マウスオーバーで提示される修正で、大半のエラーは直りました。)
- イベントリスナーとか、ダイアログとかの固定処理(onCreateDialog()など)が、ちょっとだけ違う(まあ、ここは慣れ…なのかな?)
※先程のSYSTEM GUARDIANさんのページとか、https://developer.xamarin.com/api/root/MonoAndroid-lib/さんなんかが参考になると思います。
もちろんJavaとXamarinの違いに苦戦はしましたが、何とかビルドも通り、実行。
こんな感じでボタンが表示されて、クリックすると…(しかし「ここをクリック」って、1クリック詐欺かよ…)
ちゃんとメッセージボックスが表示されました。
というわけで、とりあえずAndroid単体なら、何とかなりそうですね。(iOSも試せれば良いんですが…Mac購入の日は遠い)
今後は、もっと突っ込んだ所に手を出せるといいなあ。
まあ、まずはAndroid(というかJava)の勉強が先ですね。
※おまけ
・先述のSYSTEM GUARDIANさんのページにもありますが、ちゃんとGUIデザインも出来るみたいです。(Android SDKが古かったらしく、実行できなかった。)
・「フレームがモジュールにありません」と表示され、ステップ実行が出来ませんでした。実機デバッグだとこうなるんでしょうか。
あ、PCがヘボいから?(もう6年前のPCですから…報酬入ったら、DELL通販あたりで買うかな…)
あと、最後にソースコードを。
using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using Android.Graphics; namespace AndroidApp { [Activity(Label = "AndroidApp", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity, View.IOnClickListener { private readonly int WC = LinearLayout.LayoutParams.WrapContent; private readonly String TAG_MESSAGE = "0"; private readonly String TAG_YESNO = "1"; private readonly String TAG_TEXT = "2"; private readonly String TAG_IMAGE = "3"; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); RequestWindowFeature(WindowFeatures.NoTitle); LinearLayout layout = new LinearLayout(this); layout.SetBackgroundColor(Color.White); layout.Orientation = Orientation.Vertical; SetContentView(layout); layout.AddView(makeButton("ここをクリック!", TAG_MESSAGE)); } private Button makeButton(String text, String tag) { Button button = new Button(this); button.SetText(text, TextView.BufferType.Normal); button.Tag = tag; button.SetOnClickListener(this); button.LayoutParameters = new LinearLayout.LayoutParams(WC, WC); return button; } void View.IOnClickListener.OnClick(View view) { String tag = (String)view.Tag; if (this.TAG_MESSAGE.Equals(tag)) { MessageDialog.show(this, "メッセージボックス", "Hello World!"); } else { return; } } public class MessageDialog : DialogFragment, IDialogInterfaceOnClickListener { public override Dialog OnCreateDialog(Bundle bundle) { var ad = new AlertDialog.Builder(this.Activity); ad.SetTitle(this.Arguments.GetString("title")); ad.SetMessage(this.Arguments.GetString("text")); ad.SetPositiveButton("OK", this); return ad.Create(); } public static void show(Activity activity, String title, String text) { MessageDialog f = new MessageDialog(); Bundle args = new Bundle(); args.PutString("title", title); args.PutString("text", text); f.Arguments = args; f.Show(activity.FragmentManager, "messageDialog"); } void IDialogInterfaceOnClickListener.OnClick(IDialogInterface dialog, int which) { // throw new NotImplementedException(); } } } }