我把Parcelable
对象放在Intent
下一个Activity
:
val intent = Intent(mContext, ShowTestActivity::class.java)
intent.putExtra("test", test)
Log.d("myLog", "${intent.getParcelableExtra<Test>("test")}") // No problem
mContext.startActivity(intent)
并在下一个Activity
中获取此对象:
if (!intent.hasExtra("test")) throw Exception("Intent doesn't has 'test' extra")
val test: Test = intent.getParcelableExtra("test")
这里抛出异常:
public open class QBase(): Parcelable {
...
protected constructor(parcel: Parcel?) : this() {
parcel?.let {
question = parcel.readString() // parcel.readString() must not be null
helpText = parcel.readString()
qValue = parcel.readDouble()
qType = QType.valueOf(parcel.readString())
}
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(question)
parcel.writeString(helpText)
parcel.writeDouble(qValue)
parcel.writeString(qType.name)
}
...
}
在测试中:
public class Test(): Parcelable {
...
public var questions: ArrayList<QBase> = ArrayList()
constructor(parcel: Parcel?): this() {
parcel?.let {
...
parcel.readTypedList(questions, QBase.CREATOR)
}
}
override fun writeToParcel(p: Parcel?, p1: Int) {
p?.let {
...
it.writeTypedList(questions)
}
}
...
}
这是一个例外:
引起:java.lang.IllegalStateException:parcel.readString()不能为com.vadim.hasdfa.justlearn.Model.Questions.utils.QBase。(QBase.kt:22)at com.vadim.hasdfa.justlearn .Model.Questions.utils.QBase $ CREATOR.createFromParcel(QBase.kt:70)at com.vadim.hasdfa.justlearn.Model.Questions.utils.QBase $ CREATOR.createFromParcel(QBase.kt:68)at android.os .Parcel.readTypedList(Parcel.java:2432)位于com.vadim.hasdfa.justlearn.Model.Test。(Test.kt:28)com.vadim.hasdfa.justlearn.Model.Test $ CREATOR.createFromParcel(Test。 kt:47)在android.os.Parcel.readValue的android.os.Parcel.readParcelable(Parcel.java:2787)的com.vadim.hasdfa.justlearn.Model.Test $ CREATOR.createFromParcel(Test.kt:45) (Parcel.java:2681)在android.os.BaseBundle.unparcel(BaseBundle.java:257)的android.os.BarBundle.containsKey(BaseBundle.java)的android.os.Parcel.readArrayMapInternal(Parcel.java:3048) 435)在com.vadim.hasdfa.justlearn.Controller.Activity.BrowseTest.Sh的android.content.Intent.hasExtra(Intent.java:6859) android.app.ActivityThread.performLaunchActivity(ActivityThread)上的android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)android.app.Activity.performCreate(Activity.java:6980)的owTestActivity.onCreate(ShowTestActivity.kt:28) .java:2770)在Android.app.A活动中的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) - android.app.ActivityThread $ H.handleMessage(ActivityThread.java)的android.app.ActivityThread.-wrap11(未知来源:0) 1593)在Android.os.Handler.dispatchMessage(Handler.java:105)的android.app.Looper.loop(Looper.java:164)在android.app.ActivityThread.main(ActivityThread.java:6540)的java。来自com.android.internal.os.ZygoteInit.main的com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)中的lang.reflect.Method.invoke(Native Method)(ZygoteInit.java:767 )
question = parcel.readString() // parcel.readString() must not be null
也许您定义的字段question
是一个非空字段,如果parcel.readString()
的结果返回一个空值,将会有一个java.lang.IllegalStateException
抛出,只需将val question: String
的定义更改为val question: String?
并再试一次。
基于answer - 目前,唯一的解决方法是使实现parcelable的类的成员可以为空。
因为你的字符串是空字符串,比如question =“null”