【问题标题】:Parcel: unable to marshal value包裹:无法编组价值
【发布时间】:2017-08-23 13:05:16
【问题描述】:

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

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: Parcel: 无法编组值 com.yasin.myapp.Player@4e3940e

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

【问题讨论】:

标签: android kotlin anko


【解决方案1】:

对于使用jetpack-compose 的任何人,此问题是由rememberSavable() 引起的,请使用remember() 或将值存储在视图模型中

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你的类应该实现Parcelable(或Serializable,虽然Parcelable是Android上的建议),以便能够使用Intent在Activity之间传递对象。

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

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

      请参阅blog post

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

      androidExtensions {
          experimental = true
      }
      

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-15
          • 1970-01-01
          • 2016-03-19
          • 2011-04-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多