5

我正在将 Kotlin 与 Anko 一起使用,我想向另一个活动发送玩家列表。

class Player(var name: String?) {
var score: Int = 0

init {
    this.score = 0
 }
}

我的活动:

 class MainActivity: AppCompatActivity() {
         override fun onCreate(savedInstanceState: Bundle ? ) {
             btn.setOnClickListener {
                 val players = ArrayList <Player> ()
                 players.add(Player("John"))
                 players.add(Player("Jeff"))

                 startActivity <ScoreActivity> ("key" to players)
             }
         }
 }

当代码到达 startActivity 行时,我收到此错误:

java.lang.RuntimeException:包裹:无法编组值 com.yasin.myapp.Player@4e3940e

我想我的 Player 班级出了点问题,但我不知道是什么。我正在使用 kotlin 版本 1.1.4。有人可以帮助我吗?

4

4 回答 4

8

您的类应该实现Parcelable(或者Serializable,尽管Parcelable在 Android 上是建议的类)才能使用 Intent 跨 Activity 传递对象。

使用 Kotlin 1.1.4 和Android Extensions Plugin,您可以添加@Parcelize注解来获取Parcelable实现。

@Parcelize
class Player(var name: String?) : Parcelable {

// ...

请参阅博客文章

此功能被视为实验性功能,因此您在 build.gradle 文件中打开了实验性标志:

androidExtensions {
    experimental = true
}

另一种选择是使用此插件生成Parcelable实现所需的样板代码,但您应该记住每次更改类中的任何属性时都更新实现代码。

或者您可以编写自己的Parcelable实现。

于 2017-08-23T13:09:49.940 回答
3

对于任何处理jetpack-compose此问题的人来说,由于rememberSavable()、使用remember()或存储视图模型中的值

于 2021-03-07T08:21:03.597 回答
1

您的课程必须是ParcelableSerializable。有一个jet-brains 插件可用于生成实现(或者您可以使用实验功能Parcelize)。

Serializable通常不那么复杂,可能就是您所需要的。

于 2017-08-23T13:16:15.073 回答
0

使用 Java Just Your Class 应该实现 Parcelable 和 whit 方法:writeToParcel(Parcel parcel, int i)

于 2017-12-24T11:07:15.183 回答