Kotlin中的Android Parcelable

时间:2016-01-10 08:54:43

标签: android parcelable kotlin

我有这样的Java parcelable:

@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public KwerendaGraficzna createFromParcel(Parcel in) {
        return new KwerendaGraficzna(in);
    }

    public KwerendaGraficzna[] newArray(int size) {
        return new KwerendaGraficzna[size];
    }
};

现在尝试在Kotlin中实现它:

companion object {
    @SuppressWarnings("rawtypes")
    val CREATOR: Parcelable.Creator<KwerendaGraficzna!> = object : Parcelable.Creator<KwerendaGraficzna!> {
        override fun createFromParcel(`in`: Parcel): KwerendaGraficzna {
            return KwerendaGraficzna(`in`)
        }

        override fun newArray(size: Int): Array<KwerendaGraficzna!> {
            return arrayOfNulls<KwerendaGraficzna!>(size)
        }
    }
}

arrayOfNulls在声明已收到KwerendaGraficzna时需要KwerendaGraficzna?才会进行编译

那我该怎么办?

3 个答案:

答案 0 :(得分:15)

我怀疑你使用过时版本的Kotlin编译器(因为你使用!)。这是一个使用最新版本正确编译的版本:

companion object {
    @JvmField
    val CREATOR = object : Parcelable.Creator<KwerendaGraficzna> {
        override fun createFromParcel(`in`: Parcel): KwerendaGraficzna {
            return KwerendaGraficzna(`in`)
        }

        override fun newArray(size: Int): Array<KwerendaGraficzna?> {
            return arrayOfNulls(size)
        }
    }
}

由于Parcelable.Creator需要公开的静态字段,我们需要使用@JvmFieldJvmStatic标记CREATOR属性。

答案 1 :(得分:0)

1.1.4中使用Kotlin Android Extensions,您可以使用@Parcelize注释来摆脱createFromParcel()方法

您应该在build.gradle

中启用此功能
androidExtensions {
    experimental = true
}

例如,您的课程可能看起来像

@Parcelize
class Model(val title: String, val amount: Int) : Parcelable

在此处阅读更多内容 - https://antonioleiva.com/kotlin-android-extensions/

答案 2 :(得分:0)

您不需要实现所有样板代码。

相反,

@Parcelize
data class KwerendaGraficzna(val a: Int, val b: String): Parcelable{
    // TODO: others code
}

就是这样。

您需要在experimental中启用truebuild.gradle才能应用上述方法。

android{
    compileSdkVersion 30
    
    defaultConfig{
        applicationId "com.example"
        minSdkVersion 25
        targetSdkVersion 30
        ...
    }

    ...

    androidExtensions {
        experimental = true
    }
}