Kotlin parcelable类抛出ClassNotFoundException

时间:2017-10-13 11:27:22

标签: android-intent kotlin parcelable

我有一个类,我将其用作menu_link_content的数据模型,以便通过RecyclerView将此类的对象从一个活动传递到另一个活动我必须将其Intent

现在的问题是,我能够将对象从一个活动发送到另一个活动并检索它,以便应用程序不会崩溃,但不断将Parcelable投入logcat屏幕。

我做错了什么?

----> Person.kt

ClassNotFoundException

---->在MainActivity.kt

@Parcelize
class Person(var name: String, var username: String, var address: String, val avatar: Int) : Parcelable

----取代。 ProfilePAge.kt中的val intent = Intent(this, ProfilePage::class.java) intent.putExtra("clicked_person",person) startActivity(intent)

onCreate()

var person = intent.getParcelableExtra<Person>("clicked_person") as Person

Exception

请记住,该应用程序不会崩溃,它会继续工作,但会在logcat中显示异常

5 个答案:

答案 0 :(得分:13)

在评论中测试解决方案后,以下工作无需抛出任何异常

通过Parcelable

发送Bundle
val intent = Intent(this, ProfilePage::class.java)
var bundle = Bundle()
bundle.putParcelable("selected_person",person)
intent.putExtra("myBundle",bundle)
startActivity(intent)

恢复Parcelable

val bundle = intent.getBundleExtra("myBundle")
var person  = bundle.getParcelable<Person>("selected_person") as Person

但是,我不知道我的旧代码在问题中的区别以及为什么旧代码抛出异常以及为什么这个新代码不抛出

答案 1 :(得分:2)

我已经准备好了下面的扩展功能,以方便您在没有任何警告的情况下使用Kotlin Parcelables。

fun Intent.putParcel(key: String = "parcel_key", parcel: Parcelable) {
    val bundle = Bundle()
    bundle.putParcelable(key, parcel)
    this.putExtra("parcel_bundle", bundle)
}

fun <T : Parcelable> Intent.getParcel(key: String = "parcel_key"): T? {
    return this.getBundleExtra("parcel_bundle")?.getParcelable(key)
}

用法:

//Put parcel
intent.putParcel(parcel = Person()) //any Parcalable

//Get parcel
val person: Person?  = intent.getParcel() //auto converts using Generics

答案 2 :(得分:2)

我想目前这是Kotlin与Java之间的兼容性问题。 我找到了一个简单的解决方案,该解决方案只允许使用Kotlin,而无需样板。

const opts = {
  icons: {
    iconfont: 'mdiSvg', // 'mdi' || 'mdiSvg' || 'md' || 'fa' || 'fa4'
  },
}

vuetify: new Vuetify(opts),

然后要收回该值,您应该使用:

val intent = Intent(this, ProfilePage::class.java).apply {
    extras?.putParcellable("clicked_person",person)
}

startActivity(intent)

注意:您不需要强制转换为

答案 3 :(得分:0)

var bundle = intent.extras
var person = bundle.getParcelable<Person>("selected_person")

上面的代码对我有用。您可以按如下所示缩短代码。

var person = intent.extras.getParcelable<Person>("selected_person")

答案 4 :(得分:0)

在第一个活动中:

 val intent = Intent(this@MainActivity, DetailsActivity::class.java)
        intent.putExtra(Const.SELECTED_NOTE, noteList[position])
        startActivity(intent)

在第二个活动中:

val note = intent.getParcelableExtra<Note>(Const.SELECTED_NOTE)

说明:首先,您应放入Parcelable数据并在下一个活动中致电getParcelableExtra! 在getParcelableExtra中,您应该呼叫Data class(在这里是注意)和Key Of Bundle(在这里是 Const.SELECTED_NOTE )!

相关问题