이번 포스팅은 bundleOf()를 사용해서 Activity나 Fragment에 데이터를 더욱 더 쉽게 전달하는 방법에 대해 소개 합니다.

Setup

bundleOf()함수는 Android KTX중에 core-ktx에 있는 함수 입니다. 그래서 사용하기 전에 build.gradle에 core-ktx를 추가해 줘야 합니다. 이 포스팅을 작성했을 때 버전은 1.2.0 입니다.

dependencies {
    implementation "androidx.core:core-ktx:1.2.0"
}

bundleOf()

bundleOf 함수는 key와 value가 쌍으로 이루어진 요소를 담고 있는 Bundle을 만들어서 리턴하는 함수 입니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9ab7778b-92e8-47db-8446-98e19df79cce/Untitled.png

함수는 Pair<String, Any?>를 파라미터로 전달 받고 Bundle을 리턴하는 형태로 되어 있습니다. 또한 vararg이기 때문에 , 로 구분해서 여러 Pair를 전달 할 수 있습니다.

// Sample enum class
@Parcelize
enum class AndroidLanguage : Parcelable {
    Java,
    Kotlin
}

val bundle: Bundle = bundleOf(
    "key1" to 5,
    "key2" to 2.4f,
    "key3" to "Hello World",
    "key4" to AndroidLanguage.Kotlin
)

bundleOf() 함수는 내부에서 다양한 Type을 지원하기 때문에 Type Casting을 직접 해서 넣어 줄 필요가 없습니다. 또한 Type 검사에 대한 우선순위를 가지고 있기 때문에 Parcelable/Serializable 두개의 타입을 동시에 가지고 있는 Class도 Parcelable로 전달 할 수 있습니다.

기존 방식과 비교

기존에 Activity끼리 데이터를 주고 받을 때는 Intent에 putExtra로 key와 value를 넣어주는 방식을 사용 했습니다.

val intent = Intent(this, MainActivity::class.java)
intent.putExtra("key1", 5)
intent.putExtra("key2", 2.4f)
intent.putExtra("key3", "Hello World")
intent.putExtra("key4", AndroidLanguage.Kotlin)

하지만 위 처럼 넣게 되면 AndroidLanguage가 Parcelable이면서 Serializable이기 때문에 함수 Overload 에러가 발생하게 됩니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f73ccfbd-1b66-4bfb-a549-2a4f9896144b/Untitled.png

그래서 enum class를 전달 할 땐 AndroidLanguage.Kotlin as Parcelable 이렇게 type casting을 해줘야 합니다.

Activity

bundleOf()를 사용하게 된다면 더 깔끔하게 작성 할 수 있습니다.