Android Kotlin 中的 Parcelable:在 Parcelable 数据中找不到 CREATOR class
Android Parcelable in Kotlin: CREATOR not found on Parcelable data class
随着 Kotlin RC 的发布,我开始编写一个应用程序来学习它,但是我不知道如何让 Parcelable
工作。
数据class:
data class Project (val reponame:String,
val username:String,
val language:String,
val vcsUrl:String,
val branches:Map<String, Branch>) : Parcelable {
companion object {
val CREATOR = object : Parcelable.Creator<Project> {
override fun createFromParcel(`in`: Parcel): Project {
return Project(`in`)
}
override fun newArray(size: Int): Array<Project?> {
return arrayOfNulls(size)
}
}
}
protected constructor(parcelIn: Parcel) : this (
parcelIn.readString(),
parcelIn.readString(),
parcelIn.readString(),
parcelIn.readString(),
mapOf<String, Branch>().apply {
parcelIn.readMap(this, Branch::class.java.classLoader)
}
)
override fun describeContents(): Int {
throw UnsupportedOperationException()
}
override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeString(reponame)
dest.writeString(username)
dest.writeString(language)
dest.writeString(vcsUrl)
dest.writeMap(branches)
}
}
正在阅读:
class ProjectDetailActivity : BaseActivity() {
lateinit var project: Project
companion object {
const val EXTRA_PROJECT = "extra_project"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
project = intent.extras.getParcelable(EXTRA_PROJECT)
tvTitle.text = project.reponame
}
}
异常:
Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.eggman.circleciandroid.model.Project
at android.os.Parcel.readParcelableCreator(Parcel.java:2415)
at android.os.Parcel.readParcelable(Parcel.java:2337)
at android.os.Parcel.readValue(Parcel.java:2243)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2592)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.BaseBundle.get(BaseBundle.java:281)
at com.eggman.circleciandroid.ui.ProjectDetailActivity.onCreate(ProjectDetailActivity.kt:22)
我确定我缺少的是简单的东西,有没有其他人在最新的 Kotlin 上成功使用 Parcelable?
Kotlin 版本:1.0.0-rc-1036
Kotlin 插件版本:1.0.0-rc-1036-IJ143-4
Kotlin RC 放弃了之前弃用的所有伴随对象属性的静态字段生成(在 中了解更多信息)。
现在只有那些标记为const
、lateinit
或@JvmField
的才会生成静态字段。
您需要通过 @JvmField
注释对 val CREATOR
进行注释,因为 Android Framework 需要在您的 class.
中有一个静态字段 CREATOR
这里有一些有用的 Kotlin 扩展函数,可以帮助您创建 CREATOR
s,还有一些示例(使用数据 classes 和数据 class 中的列表)
Gist: Data Class & Parcelables example
我在 Android 应用程序中使用此代码:(link)
您可以在这里找到相同的代码:(link)
随着 Kotlin RC 的发布,我开始编写一个应用程序来学习它,但是我不知道如何让 Parcelable
工作。
数据class:
data class Project (val reponame:String,
val username:String,
val language:String,
val vcsUrl:String,
val branches:Map<String, Branch>) : Parcelable {
companion object {
val CREATOR = object : Parcelable.Creator<Project> {
override fun createFromParcel(`in`: Parcel): Project {
return Project(`in`)
}
override fun newArray(size: Int): Array<Project?> {
return arrayOfNulls(size)
}
}
}
protected constructor(parcelIn: Parcel) : this (
parcelIn.readString(),
parcelIn.readString(),
parcelIn.readString(),
parcelIn.readString(),
mapOf<String, Branch>().apply {
parcelIn.readMap(this, Branch::class.java.classLoader)
}
)
override fun describeContents(): Int {
throw UnsupportedOperationException()
}
override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeString(reponame)
dest.writeString(username)
dest.writeString(language)
dest.writeString(vcsUrl)
dest.writeMap(branches)
}
}
正在阅读:
class ProjectDetailActivity : BaseActivity() {
lateinit var project: Project
companion object {
const val EXTRA_PROJECT = "extra_project"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
project = intent.extras.getParcelable(EXTRA_PROJECT)
tvTitle.text = project.reponame
}
}
异常:
Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.eggman.circleciandroid.model.Project
at android.os.Parcel.readParcelableCreator(Parcel.java:2415)
at android.os.Parcel.readParcelable(Parcel.java:2337)
at android.os.Parcel.readValue(Parcel.java:2243)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2592)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.BaseBundle.get(BaseBundle.java:281)
at com.eggman.circleciandroid.ui.ProjectDetailActivity.onCreate(ProjectDetailActivity.kt:22)
我确定我缺少的是简单的东西,有没有其他人在最新的 Kotlin 上成功使用 Parcelable?
Kotlin 版本:1.0.0-rc-1036
Kotlin 插件版本:1.0.0-rc-1036-IJ143-4
Kotlin RC 放弃了之前弃用的所有伴随对象属性的静态字段生成(在
现在只有那些标记为const
、lateinit
或@JvmField
的才会生成静态字段。
您需要通过 @JvmField
注释对 val CREATOR
进行注释,因为 Android Framework 需要在您的 class.
CREATOR
这里有一些有用的 Kotlin 扩展函数,可以帮助您创建 CREATOR
s,还有一些示例(使用数据 classes 和数据 class 中的列表)
Gist: Data Class & Parcelables example
我在 Android 应用程序中使用此代码:(link)
您可以在这里找到相同的代码:(link)