すいません、VB4しかやってないんです、VBAはやったけど(ぼそ) チラシの裏だって立派な書き込み空間なんだからねっ!資源の有効活用なんだからねっ!とか偉そうに言ってるけど、実は色々と書き残したいだけ

だからなに? どうしろと? くるみサイズの脳みそしかないあやしいジャンガリアンベムスターがさすらう贖罪蹂躙(ゴシックペナルティ)

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  632  : 記事  35  : コメント  11671  : トラックバック  143

ニュース


片桐 継 は
こんなやつ

かたぎり つぐ ってよむの

大阪生まれ河内育ちなんだけど
関東に住みついちゃったの
和装着付師だったりするの
エセモノカキやってたりするの
VBが得意だったりするの
SQL文が大好きだったりするの
囲碁修行中だったりするの
ボトゲ好きだったりするの
F#かわいいよF#

正体は会った人だけ知ってるの

空気読まなくてごめんなさいなの


わんくまリンク

C#, VB.NET 掲示板
C# VB.NET掲示板

わんくま同盟
わんくま同盟Blog


WindowsでGo言語
WindowsでGo言語


ネット活動


SNSは疲れました

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

イベント活動

プログラムの活動

SerializableAttributeAndoridアプリの画面を切り替える時、画面同士の情報の引き渡しができる仕組みがあるの。この時に、仲介役となるIntentクラスはとても大切。

やりたかったことは、とあるクラスに格納された情報を、画面の受け渡しに使いたいって事だったんだけど、Javaだと次の方法で出来る。

  • 受渡のためのクラスにSerializableを持たせる
  • そのクラスを含むIntentを作成する
  • StartActivityする

NextActivityが次に行きたいActivity、Serializedが自分で作った型だという想定で、サンプルコートだと、

Serialized serialized = new Serialized();
String record_key = "Key"
Intent intent = new Intent(this, NextActivity.Class);
intent.putExtra(record_key, serialized);
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent);

こんな感じ。ISerializableを持たせることで、情報を一つのクラスに取りまとめて渡せるので便利。

そして、この部分で使ってるJavaDocは、

http://developer.android.com/reference/android/content/Intent.html#putExtra(java.lang.String, java.io.Serializable)
http://developer.android.com/reference/android/content/Intent.html#putExtra%28java.lang.String,%20java.io.Serializable%29

これ。確かに、putExtra( String, Serializable ) のメソッドが使えるように、作られている。

で、これを今度は、F#で作る。調べたところ、C#でも同じようにクラスの宣言でISerializableを使うことができるので、出来るんだろうなと気楽に思ってた。さらに調べると、F#のtype宣言は[<SerializableAttribute>]を使うことで実現できるというところまで学習。

ところが、ちょっと問題w C#やF#でいうISerializableは.NetFrameworkのものであって、Java.IOのそれではない。

考えれば当たり前。

そこをラップしてくれるなんていう便利なものがXamarinAPIにあればなー、なんて思って頑張ったけど、行き着いた答えがこれ。

Working With JNI | Xamarin
http://developer.xamarin.com/guides/android/advanced_topics/java_integration_overview/working_with_jni/

ラップは自分でしろ、そのためのJNIは用意してやるから(ニッコリ)と、読めたw

つまり、

  • Java.IO.ISerializableをJNIした継承インターフェイスを作る
  • 継承インターフェイスとSerializableAttributeをもつクラスを作る
  • putExtraでそのクラスを受渡す

うーん、はまりそう。深い闇というか沼の入り口に立ってる予感。とすると、逃げ道を考える。

  1. Json化して、テキストにした後、Intent.Extras.GetSerializableメソッドでシリアライズしてputExtra
  2. 受渡クラスを保持するシングルトンクラスを作成し、項目を特定するIDでputExitra

どちらも、JNIを使わなくても、できる形。Json使うのも魅力だけど、2の方法で作ってみた。受渡したいクラスをリストで保持するシングルトンのrecordServiceを作って、メソッドGetPositionでそのリストの場所を取得できるようにしておく。

let position : int16 = int16 recordService.GetPosition
let activity = new Intent(this, typeof<NextActivity>)
let extra : int16[] = [|position|]
activity.PutExtra(record_key, extra) |> ignore
activity.SetAction(Intent.ActionView) |> ignore
this.StartActivity(activity)

これで、とりあえず、やりたいことは実現できた。個人で好きにやってるから、こんな風なやり方したけどJson化する方がC#やJavaとの移植性が高い感じがするので、良いかもしれない。

投稿日時 : 2014年8月15日 21:02

コメント

No comments posted yet.

Post Feedback

タイトル
名前
Url:
コメント