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

Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Xamarin.Android で PutParcelableArrayListExtra を使い List<T> を他の Activity に渡すには?

Xamarin Xamarin.Android

こんにちは。エクセルソフトの田淵です。

Android で Activity 間でデータのやり取りをする場合、intent の PutExtra などを使用します。stringint などはそのまま渡せて、オブジェクトを渡したい場合は、Parcelable を使用します。

今回は、Activity で持っている ListPutParcelableArrayListExtra で渡す方法を調べてみました。

例えばデータを追加していくと、次の Activity の ListView に追加されていくようなイメージです。

f:id:ytabuchi:20161205165516g:plain:w300

サンプル

github.com

こちらにアップしておきました。

MainActivity から、2つのページに遷移できますが、一つ目のボタンでは一つのオブジェクトを単純に Parcelable にして渡す方法です。

こちらは、@amay077 さんの

www.buildinsider.net

をご覧ください。

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);

受け渡し側の Activity

受け取り

まずは 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);
    }
}

受け取り側の Activity

変換前のオブジェクトは IParcelable を継承している必要があるため、このように少し面倒な書き方が必要ですが、慣れてしまえばなんとかなりそうですね。

ListView の Adapter クラス

ArrayAdapter、SimpleListItem1 以外は Adapter クラスが必要なようです。今回は上下二段のリスト SimpleListItem2 を使用したため、Adapter を用意しました。

Custom Adapter については、以下をご覧ください。

ytabuchi.hatenablog.com

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 も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。

以上です。