Kotlin中的Android Parcelable:在Parcelable数据类中找不到CREATOR
随着Kotlin RC的发布,我开始编写一个应用程序来学习它,但我不知道如何让Parcelable
工作。
数据类:
data class Project (val reponame:String, val username:String, val language:String, val vcsUrl:String, val branches:Map) : Parcelable { companion object { val CREATOR = object : Parcelable.Creator { override fun createFromParcel(`in`: Parcel): Project { return Project(`in`) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } protected constructor(parcelIn: Parcel) : this ( parcelIn.readString(), parcelIn.readString(), parcelIn.readString(), parcelIn.readString(), mapOf().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)
我相信这是简单的我错过了,还有其他人有最新的科特林Parcelable成功?
Kotlin版本:1.0.0-rc-1036
Kotlin Plugin版本:1.0.0-rc-1036-IJ143-4
代码可查看@ https://github.com/eggman87/circle-kotlin
Kotlin RC删除了先前弃用的所有伴侣对象属性的静态字段生成(请参阅此答案 )。
现在只有那些由const
, lateinit
或@JvmField
标记的字段才会生成一个静态字段。
您需要通过@JvmField
注释来注释val CREATOR
,因为Android Framework需要在您的类中使用静态字段CREATOR
。
这里有一些有用的Kotlin扩展函数可以帮助你创建CREATOR
,还有一些例子(在数据类中使用数据类和列表)
Gist:Data Class&Parcelables示例
我在Android应用程序中使用此代码:( 链接)
相同的代码,你可以在这里find它:( 链接)
- RecyclerView在另一个RecyclerView(Mvvm + Databinding + Kotlin)
- 视差标题效果与RecyclerView
- 在Kotlin中同时对列表中的每个元素应用变换的最佳方法
- compileReleaseKotlin失败,java.lang.ClassNotFoundException:com.sun.tools.javac.util.Context
- 使用Retrofit 2.0和RxJava获取响应状态代码
- 如何根据自定义规则验证源代码? (代码中没有“DANGER”字符串)
- Kotlin:onGlobalLayout没有被调用
- 无法在Kotlin中“findViewById”。 获取错误“类型推断失败”
- 片段实例被保留,但子片段不被重新连接