728x90

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") 



블로그 이미지

Link2Me

,