echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

Xamarinの導入 その2(コーディング)

前回、エラー出まくりながらも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の違いに苦戦はしましたが、何とかビルドも通り、実行。
f:id:Makky12:20161022224054j:plain
こんな感じでボタンが表示されて、クリックすると…(しかし「ここをクリック」って、1クリック詐欺かよ…)

f:id:Makky12:20161022224102j:plain
ちゃんとメッセージボックスが表示されました。

というわけで、とりあえず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();
            }
        }
    }
}