Activity간에 Data를 묶어서 전달해야 할 경우가 있다.
자바로 구현한 예제를 코틀린으로 변환하면 일단 에러가 난다.
import android.os.Parcel; import android.os.Parcelable;
public class Profiles implements Parcelable { // Parcelable 인터페이스 : 커스텀 클래스나 오브젝트를 다른 컴포넌트에 전달해 줘야 할 경우 // A Activity에서 B Activity로 데이터를 전달할 때, 데이터를 묶어서 전달한다 // https://developer.android.com/reference/android/os/Parcelable 참조 // Android에서 성능적인 이슈로 Serializable 보다는 Parcelable를 사용하는걸 추천한다.
String name; int age; String gender;
public Profiles() { // 모든 클래스는 반드시 생성자를 가져야 한다. // 생성자가 하나도 없을 때만, 컴파일러가 default constructor(기본 생성자) 자동 추가 // 기본 생성자 : 매개변수가 없는 생성자 }
public Profiles(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; }
//Parcel은 데이터를 전달할 때 사용되는 객체 //Parcel 데이터를 읽어서 변수에 할당 public Profiles(Parcel src) { name = src.readString(); age = src.readInt(); gender = src.readString(); }
@Override public int describeContents() { return 0; }
@Override public void writeToParcel(Parcel dest, int flag) { dest.writeString(name); dest.writeInt(age); dest.writeString(gender); }
public static final Creator<Profiles> CREATOR = new Creator<Profiles>() {
@Override public Profiles createFromParcel(Parcel parcel) { return new Profiles(parcel); }
@Override public Profiles[] newArray(int size) { //배열 객체 만들어 주기 return new Profiles[size]; } }; } |
Android Studio가 제공하는 파일 변환 기능으로 코틀린으로 변환하고 약간 수작업으로 수정한 예제
import android.os.Parcel import android.os.Parcelable import kotlinx.android.parcel.Parceler import kotlinx.android.parcel.Parcelize
@Parcelize class Profiles() : Parcelable { // Parcelable 인터페이스 : 커스텀 클래스나 오브젝트를 다른 컴포넌트에 전달해 줘야 할 경우 // A Activity에서 B Activity로 데이터를 전달할 때, 데이터를 묶어서 전달한다 // Android에서 성능적인 이슈로 Serializable 보다는 Parcelable를 사용하는걸 추천한다. var name: String? = null var age = 0 var gender: String? = null
constructor(name: String?, age: Int, gender: String?) : this() { this.name = name this.age = age this.gender = gender }
// Parcel은 데이터를 전달할 때 사용되는 객체 // Parcel 데이터를 읽어서 변수에 할당 constructor(parcel: Parcel) : this() { parcel.run { name = readString() age = readInt() gender = readString() } }
override fun describeContents(): Int = 0
companion object : Parceler<Profiles> { override fun Profiles.write(parcel: Parcel, flag: Int) { parcel.writeString(name) parcel.writeInt(age) parcel.writeString(gender) }
override fun create(parcel: Parcel): Profiles { return Profiles(parcel) } } } |
그런데 이런 변환 과정을 할 필요없이 아주 간단하게 해결할 수 있다.
https://developer.android.com/kotlin/parcelize 를 참조하자.
앱 build.gradle 추가사항
androidExtensions { experimental = true }
|
@Parcelize annotation을 사용하면, writeToParcel()/createFromParcel()를 자동으로 구현해준다.
아래 코드를 보라. 얼마나 간단한가.
import android.os.Parcelable import kotlinx.android.parcel.Parcelize
@Parcelize data class Profiles( var name: String="", var age:Int = 0, var gender: String="" ):Parcelable |
Activity 이동전
val intent = Intent(this@MainActivity, TargetActivity::class.java) intent.putExtra("parcel", profile) startActivity(intent)
|
Activity 이동후
val profile: Profiles = intent.getParcelableExtra("parcel") |