読者です 読者をやめる 読者になる 読者になる

SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.Android アクティビティの起動

【 Xamarin 記事一覧 】

1 StartActivity

別のActivityを起動するにはStartActivity()を使用します。

インテリセンスによると、下記のようなものの列挙されているが、ちょっと、ややこしかったので、本日は2,3には触れ無いことにします。
1 StartActivityForResult
2 StartActivityFromChild 子ActivityからstartActivityもしくはstartActivityForResultを実行する
3 StartActivityIfNeeded 新たなActivityが必要な場合のみActivityを生成する

2 StartActivityのパラメータ

StartActivityに指定できるパラメータはIntentとTypeがあります。


//Intentを使用する場合
var intent = new Intent(this,typeof (Activity2));
StartActivity(intent);

//typeを使用する場合
StartActivity(typeof(Activity2));

JavaSDKでは、パラメータにIntentを取らないStartActivityが見当たらないので、Typeだけで指定できるのは、Xamarin拡張のようです。内部でIntentを自動的に生成しているって事なのでしょうか・・・もし、Intentを特にいじる必要が無いのであれば、こちらの方が楽でスッキリしていてイイ感じです。

3 起動されたActivityのクローズ

起動された側のActivityが、BackキーやFinish()呼び出してクローズされた場合、元のActivityに戻ります。(多重で、StartActivity()した場合も、順番に戻ります)

4 値の受け渡し

無題

StartActivityForResult()を使用すると、呼び出し元のAcrivityに戻った時に、OnActivityResultのイベントが発生します。このイベントを利用することで、戻り値の受け渡しが可能になります。
(StartActivityでは、このイベントは発生しない)

起動された側のActivityでは、クローズ前にSetResult()を使用して値をセットし、呼び出し側では、OnActivityResultイベントのresultCodeで、この値を取得します。

呼び出し元(Activity1.cs)

private const int RequestCode = 100; //リクエストコード
void button_Click(object sender, EventArgs e){
    //Activity2を起動する
    StartActivityForResult(typeof(Activity2), RequestCode);
}
//呼び出し元へ戻った時のイベント
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data){
    if (RequestCode == requestCode) { //呼び出し元の確認
        Toast.MakeText(this,string.Format("resultCode:{0} data:{1}", requestCode, data),ToastLength.Short).Show();
    }
}

起動された側(Activity2.cs)

private void button_Click(object sender, EventArgs e){
    //戻り値をセットする
    SetResult(Result.Ok, new Intent("TEST"));
    Finish(); //Activityを終了させる
}


(注意)StartActivityForResultに指定するrequestCodeは0以上でないと機能しない(OnActivityResultイベント自体が発生しない)


【 Xamarin 記事一覧 】