我创建了一个名为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()