使用Intent.putExtra传递Parcelable数组

时间:2017-12-03 14:01:28

标签: android android-intent kotlin

我创建了一个名为Song的Parcelable类,我试图在使用Intent.putExtra()的活动之间传递它们的数组,一旦我到达活动并使用this.intent.getParcelableArrayExtra我得到一个parcelable数组我无法找到将其转换回歌曲数组的方法。

代码启动活动:

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
}

1 个答案:

答案 0 :(得分:3)

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

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

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