gpt4 book ai didi

android - 使用 Intent.putExtra 传递 Parcelable 数组

转载 作者:行者123 更新时间:2023-11-29 16:47:01 24 4
gpt4 key购买 nike

我已经创建了一个名为 Song 的 Parcelable 类,并且我正在尝试使用 Intent.putExtra() 在 Activity 之间传递它们的数组,目前一旦我进入 Activity 并使用 this.intent.getParcelableArrayExtra 我得到一个 parcelable 数组,我找不到将其转换回歌曲数组的方法。

代码开始 Activity :

val i = Intent(this, CompletedSongsActivity::class.java)
val completedSongs = songList.filter{ it.solved }.toTypedArray()
i.putExtra("COMPLETED_SONGS", completedSongs)
startActivity(i)

Activity 代码:

val songs = this.intent.getParcelableArrayExtra("COMPLETED_SONGS") as Array<Song>

然后我得到错误:

java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to com.example.kyle.songle.Song[]

编辑:

我的歌曲类:

class Song(val name: String,val artist: String,val youtubeURL: String,val number: Int, var solved: Boolean): Parcelable {

companion object {
@JvmField @Suppress("unused")
val CREATOR = object: Parcelable.Creator<Song> {
override fun newArray(size: Int): Array<Song?> {
return arrayOfNulls<Song>(size)
}

override fun createFromParcel(source: Parcel?): Song {
return Song(source!!)
}
}}

private constructor(parcelIn: Parcel) : this(parcelIn.readString(),parcelIn.readString(),parcelIn.readString(),0,true)

override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.writeString(name)
dest?.writeString(artist)
dest?.writeString(youtubeURL)
}

override fun describeContents(): Int {
return 0
}

最佳答案

无法像您尝试的那样直接转换数组。getParcelableArrayExtra("COMPLETED_SONGS") 的返回值就 android 的操作系统而言,是一个 Parcelable 的数组。恰好包含 Song实例。

要直接使用它,您可以使用 Array.filterIsInstance 创建函数 List<Song>这保证是类型安全的。如果它绝对需要是一个数组,那么 .toTypedArray()会将其转换回 Array<Song>

这将导致以下代码:val songs = getParcelableArrayExtra("COMPLETED_SONGS").filterIsInstance<Song>().toTypedArray()

关于android - 使用 Intent.putExtra 传递 Parcelable 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47619146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com