使用Intent.putextra传递包裹阵列



我创建了一个名为Song的包裹类,并且正在尝试使用Intent.putextra()当前进行活动并使用this.intent.getParpeRableAblearRayExtra,并试图通过intent.putextra()在活动之间传递一系列。我得到了一系列的包裹,我找不到将其转换回一系列歌曲的方法。

代码开始活动:

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

活动中的代码:

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
}

无法在尝试执行时直接转换数组。就Android的OS而言,getParcelableArrayExtra("COMPLETED_SONGS")的返回值是Parcelable的数组,恰好仅包含Song实例。

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

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

最新更新