5
3

More than 5 years have passed since last update.

Activity間のObject引き渡し(Gson)

Posted at

 方法

以前ObjectでSerializableをimplementsした方法を記載しました。
Activity間のObject引き渡し

今回はGsonを使用してObjectを引き渡します。

実装

Gradle

build.gradle
dependencies {
    // Gson
    compile 'com.google.code.gson:gson:2.8.0'
}

Object

Activity間で引き渡すobject

DataState.kt
data class DataState(
    val id: Int,
    val name: String
)

Activity

引き渡し元

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val intent = Intent(this, SecondActivity::class.java)
        val state = DataState(0, "name0")
        // Gsonで Object → String
        intent.putString(SecondActivity.KEY_STATE, Gson().toJson(state)) 
        startActivity(intent)
    }
}

引き渡し先

SecondActivity.kt
class SecondActivity : AppCompatActivity() {

    companion object {
        val KEY_STATE = "key_state"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val stateStr = intent.getString(KEY_STATE)
        // Gsonで String → Object
        val state = Gson().fromJson<DataState>(stateStr, DataState::class.java)

        if(state is DataState){
            println(state.id)
            println(state.name)
        }
    }
}

出力結果

0
name0

list objectの引き渡し

Activity

引き渡し元

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val states = arrayListOf<DataState>()
        for(i in 0..2){
            val state = DataState(i, "name$i")
            states.add(state)
        }

        val intent = Intent(this, SecondActivity::class.java)
        // Gsonで List<Object> → String
        intent.putExtra(SecondActivity.KEY_STATE, Gson().toJson(states))
        startActivity(intent)
    }
}

引き渡し先

SecondActivity.kt
class SecondActivity : AppCompatActivity() {

    companion object {
        val KEY_STATE = "key_state"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val statesStr = intent.getStringExtra(KEY_STATE)
        // Gsonで String → List<Object>
        val states = Gson().fromJson<List<DataState>>(statesStr, object : TypeToken<List<DataState>>() {}.type)

        states.forEach {
            println(it.id)
            println(it.name)
        }
    }
}

list object 出力結果

0
name0
1
name1
2
name2

まとめ

Serializableをimplementsするより簡単

5
3
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
5
3