본문 바로가기

Kotlin_study

[Kotlin] Parcelize 사용하여 intent에 data class 담아 전달하기

서버에서 받아 온 데이터를 다른 액티비티에 전달하고자 했습니다. 이 과정에서 intent에 data class를 담아 전달하기 위해 방법을 찾던 중 Parcelize에 대해 알게 되었고 이를 사용하여 구현해보았습니다.

//build.gradle

plugins {
    id "kotlin-parcelize"
}

우선 gradle에 plugin을 추가해줍니다.

//TestResponse.kt

@Parcelize
data class GetTestResponse(
    @SerializedName("status") val status : String,
    @SerializedName("body") val body : List<Test>?
    ) : Parcelable

@Parcelize
data class Test(
    @SerializedName("quizIdx") val quizIdx : Int,
    @SerializedName("category") val category : String,
    @SerializedName("question") val question : String,
    @SerializedName("answer") val answer : Boolean,
    @SerializedName("solution") val solution : String
) : Parcelable

서버에서 넘겨준 데이터를 받기 위해 data class를 만들어줍니다. 이 때, data class 앞에 @Parcelize 어노테이션을 추가해줍니다. 여기서 저는 Test의 List를 intent에 담아 넘겨주려고 하여 TestGetTestResponse 둘 다 @Parcelize 어노테이션을 추가해줬습니다.

//TestActivity.kt

val intent = Intent(this, QuestionActivity::class.java)
intent.putExtra("Test", testList)
startActivity(intent)

TestActivity에서 QuestionActivity로 넘어갈 때, testList를 전달해주기 위해 putExtra를 사용해줍니다. 여기서는 다른 자료형을 전달할 때와 똑같습니다. 이 때 "Test"는 키값이고 testList가 전달 될 value입니다.

//QuestionActivity.kt

val intent  = intent
var testList = intent?.getParcelableArrayListExtra<Test>("Test")

intent로 넘겨준 데이터를 불러올 때는 위와 같이 작성해줍니다. 저의 경우에는 Test의 arrayList를 전달 받는 것이어서 getParcelableArrayListExtra를 사용했는데 여러 개가 아니라면 getParcelableExtra를 사용하면 될 것 같습니다. 이를 활용하여 다음과 같은 화면을 만들 수 있었습니다.

안드로이드 앱 Hi STORY(퀴즈 화면)

참고

Parcelable 구현 생성기  |  Android 개발자  |  Android Developers