我创建了一个名为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
}
答案 0 :(得分:3)
无法像您尝试的那样直接转换数组。
就android的操作系统而言,getParcelableArrayExtra("COMPLETED_SONGS")
的返回值是Parcelable
的数组,恰好只包含Song
个实例。
要直接使用它,您可以使用Array.filterIsInstance
函数创建保证类型安全的List<Song>
。如果它绝对需要是一个数组,那么.toTypedArray()
会将其转换回Array<Song>
这应该产生以下代码:val songs = getParcelableArrayExtra("COMPLETED_SONGS").filterIsInstance<Song>().toTypedArray()