こんにちは。エクセルソフトの田淵です。
Android で Activity 間でデータのやり取りをする場合、intent の PutExtra
などを使用します。string
、int
などはそのまま渡せて、オブジェクトを渡したい場合は、Parcelable
を使用します。
今回は、Activity で持っている ListPutParcelableArrayListExtra
で渡す方法を調べてみました。
例えばデータを追加していくと、次の Activity の ListView に追加されていくようなイメージです。
サンプル
こちらにアップしておきました。
MainActivity から、2つのページに遷移できますが、一つ目のボタンでは一つのオブジェクトを単純に Parcelable にして渡す方法です。
こちらは、@amay077 さんの
をご覧ください。
Parcel にする場合の注意点は、上記記事にもありますが、IParcelable
を継承したクラスで必要な WriteToParcel
メソッドで Parcel に書き込むオブジェクトと、
public void WriteToParcel(Parcel dest, [GeneratedEnum] ParcelableWriteFlags flags) { dest.WriteString(Item.Name); dest.WriteString(Item.Time.ToString()); }
IParcelableCreator
を継承したクラスで必要な CreateFromParcel
メソッドで読み込むオブジェクトを同じにすること。
public Java.Lang.Object CreateFromParcel(Parcel source) { TableItemParcelable item = new TableItemParcelable( source.ReadString(), DateTime.Parse(source.ReadString())); return item; }
後は、IParcelableCreator GetCreator
メソッドには、[ExportField("CREATOR")]
が必要というところでしょうか。
[ExportField("CREATOR")] public static IParcelableCreator GetCreator() { return new TableItemParcelableCreator(); }
List を渡す場合はどうする?
受け渡し
PutParcelableArrayListExtra(string name, List<IParcelable> value)
メソッドを使用するようです。
IParcelable
を継承したクラスの List を List<IParcelable>
に移し替えてから Intent
に格納し、次の Activity に渡します。
var item = new TableItemParcelable(nameText.Text, DateTime.Parse(timeText.Text)); TableItems.Add(item); List<IParcelable> values = new List<IParcelable>(); foreach (var x in TableItems) { values.Add(new TableItemParcelable(x.Item.Name, x.Item.Time)); } var intent = new Intent(this, typeof(GetParcelableArrayListActivity)); intent.PutParcelableArrayListExtra("data", values); StartActivity(intent);
受け取り
まずは Intent を受け取ったか?を確認し、受け取った Intent を変換前の IParcelable
を継承したクラス(ここではTableItemParcelable
)でキャストし、その List を ListAdapter
で使用しているモデルに格納します。
var intent = this.Intent; if (intent != null && intent.HasExtra("data")) { var data = intent.GetParcelableArrayListExtra("data"); foreach (var item in data) { tableItems.Add(((TableItemParcelable)item).Item); } }
変換前のオブジェクトは IParcelable
を継承している必要があるため、このように少し面倒な書き方が必要ですが、慣れてしまえばなんとかなりそうですね。
ListView の Adapter クラス
ArrayAdapter、SimpleListItem1 以外は Adapter クラスが必要なようです。今回は上下二段のリスト SimpleListItem2
を使用したため、Adapter を用意しました。
Custom Adapter については、以下をご覧ください。
Xamarin 気になった方は
是非 ダウンロード して触ってみてください。Visual Studio 2015 をご利用の方は Update 3 にアップデートする際にカスタムインストールで Xamarin を追加しましょう。 学習用リソース や JXUG リンクページ に参考資料を纏めてますので併せてどうぞ。
Xamarin の導入支援サービスを始めました。ベースは基本的なアプリを一緒に作ることで Xamarin を使えるようになって頂く内容ですが、ご要望に応じて講習内容のカスタマイズも可能です。詳しくは田淵までお問い合わせください(^^)
有償セミナー、トレーニング | Xamarin : XLsoft エクセルソフト
Xamarin の情報が欲しい方はこのブログも購読いただいたり、私のTwitterアカウントをフォローいただいたりすると嬉しいです。
私が所属している エクセルソフト の宣伝を少しさせてください。弊社は開発者向けの様々なソフトウェアを扱っています。おなじみの ReSharper (JetBrains)、 や Atlassian の JIRA, Confluence、Office/PDF ファイルを .NET/Java で操作するライブラリ Aspose(アスポーズ)、Windows アプリ、Web ページ、iOS/Android アプリの UI テストができる TestComplete などお勧めです(^^) また、Visual Studio Professional/Enterprise with MSDN も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。
以上です。