이번 포스팅은 bundleOf()를 사용해서 Activity나 Fragment에 데이터를 더욱 더 쉽게 전달하는 방법에 대해 소개 합니다.
bundleOf()함수는 Android KTX중에 core-ktx에 있는 함수 입니다. 그래서 사용하기 전에 build.gradle에 core-ktx를 추가해 줘야 합니다. 이 포스팅을 작성했을 때 버전은 1.2.0 입니다.
dependencies {
implementation "androidx.core:core-ktx:1.2.0"
}
bundleOf 함수는 key와 value가 쌍으로 이루어진 요소를 담고 있는 Bundle을 만들어서 리턴하는 함수 입니다.
함수는 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 에러가 발생하게 됩니다.
그래서 enum class를 전달 할 땐 AndroidLanguage.Kotlin as Parcelable
이렇게 type casting을 해줘야 합니다.
bundleOf()를 사용하게 된다면 더 깔끔하게 작성 할 수 있습니다.