LoginSignup
14
12

More than 5 years have passed since last update.

Intentでオブジェクトを渡す方法

Last updated at Posted at 2018-07-29

IntentのputExtraにはオブジェクトを渡せないので、さてどうしたものかと思っていたのですが、
GSONを使ってJSON文字列に変換すれば、ただの文字列なので簡単に受け渡しをすることができました!

Dependencies

  • Kotlin
    • 今回はKotlinを使っていますが、Javaでも同様のことが可能です。
  • GSON
    • ようは文字列にシリアライズ/デシリアライズができればいいのでGSONじゃなくてもいいです。

オブジェクトのJSON文字列化

まずはオブジェクトです。データは単純にして、以下のようなものを使うことにします。

data class Person(val name: String,
                  val age: Int,
                  val height: Int)

data class Team(val name: String,
                  val member: List<Person>)

で、例えば以下のようにオブジェクトを生成してあげて、Gson().toJson()で文字列変換してみます。

private fun createObjectForTest(): String {
    // これは普通にKotlinのオブジェクトを生成してる
    val team = Team("サッカー部", listOf(
            Person("田中", 15, 179),
            Person("太田", 16, 169),
            Person("斎藤", 17, 180)
    ))

    // ここでオブジェクトを文字列に変換して返却してる
    return Gson().toJson(team)
}

Gsonを使うと超簡単にJSON文字列に変換できますね。
で、文字列のほうは以下のようにちゃんとJSON文字列に変換されてます。

// printlnで表示されたものをこぴっぺ
{"member":[{"age":15,"height":179,"name":"田中"},{"age":16,"height":169,"name":"太田"},{"age":17,"height":180,"name":"斎藤"}],"name":"サッカー部"}

整形するとこんな感じでいい感じ。

{
   "member":[
      {
         "age":15,
         "height":179,
         "name":"田中"
      },
      {
         "age":16,
         "height":169,
         "name":"太田"
      },
      {
         "age":17,
         "height":180,
         "name":"斎藤"
      }
   ],
   "name":"サッカー部"
}

putExtraで渡す

JSON文字列の変換方法はわかったので実際にIntentで渡してみます。
MainActivityに適当なボタンを配置してonClick関数を定義してセットします。

// テスト用のオブジェクトを生成して返却します
private fun createObjectForTest(): Team {
    return Team("サッカー部", listOf(
            Person("田中", 15, 179),
            Person("太田", 16, 169),
            Person("斎藤", 17, 180)
    ))
}

fun onClickNextBtn(V: View) {
    val team: Team = this.createObjectForTest()

    val intent = Intent(this, SubActivity::class.java)
    // Gsonを使って文字列変換したものをセット
    intent.putExtra("key_team", Gson().toJson(team))

    startActivity(intent)
}

以上で、オブジェクトをIntentに乗せることができました。
あとは受け取り側で、"key_team"を指定して受け取ればいいですね。

受け取り側でJSON文字列をデシリアライズする

受け取り側はキーで値を取得できますが、もちろんStringなのでデシリアライズが必要です。
以下のように受け取った後に、Gson().fromJson<>()を使ってあげれば一発でもとに戻せます。

// ここはJSON文字列
val json = intent.extras.getString("key_team")
// 型を指定して文字列からデシリアライズする
val team = Gson().fromJson<Team>(json, Team::class.java)

まとめ

JSONは文字列なので、GSONを使って変換すれば、ほかにも色々使いどころがありそうです。
例えば、プリファレンスへの保存にも実はJSONが使えます。
皆さんも色々使ってみてください。

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12