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でそのクラスを受渡す
うーん、はまりそう。深い闇というか沼の入り口に立ってる予感。とすると、逃げ道を考える。
- Json化して、テキストにした後、Intent.Extras.GetSerializableメソッドでシリアライズしてputExtra
- 受渡クラスを保持するシングルトンクラスを作成し、項目を特定する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との移植性が高い感じがするので、良いかもしれない。