如何在kotlin中通过意图传递自定义对象

时间:2017-12-01 12:15:08

标签: android android-intent kotlin kotlin-android-extensions

  fun launchNextScreen(context: Context, people: People): Intent {
  val intent = Intent(context, NextScreenActivity::class.java)
  intent.putExtra(EXTRA_PEOPLE, (Parcelable) people)
  //intent.putExtra(EXTRA_PEOPLE, people as Parcelable)
  //intent.putExtra(EXTRA_PEOPLE, people)
  // tried above all three ways
  return intent
}

尝试使用kotlin在上面的代码中通过intent传递People类型的人物对象,但是收到错误。 请帮我解决这个问题。

9 个答案:

答案 0 :(得分:20)

首先,请务必在Serializable - s类中实施People

class People : Serializable {
//your stuff
}

确保People类的内部字段也实现Serializable接口,否则会导致运行时错误。

然后它应该工作:

 fun launchNextScreen(context: Context, people: People): Intent {
  val intent = Intent(context, NextScreenActivity::class.java)
  intent.putExtra(EXTRA_PEOPLE, people)
  return intent
}

要从Intent接收人员,您需要致电:

val people = getIntent().getExtras().getSerializableExtra(EXTRA_PEOPLE) as? People

答案 1 :(得分:14)

在对象中实现序列化:

data class Object (
        var param1: Int? = null,
        var param2: String? = null
) : Serializable

class Object : Serializable {
        var param1: Int? = null,
        var param2: String? = null
}

然后,您可以使用Intent传递对象:

val object = Object()
...
val intent = Intent(this, Activity2::class.java)
intent.putExtra("extra_object", object as Serializable)
startActivity(intent)

最后,在Activity2中,您得到的对象带有:

val object = intent.extras.get("extra_object") as Object

答案 2 :(得分:5)

找到了一种更好的方法:

在你的毕业典礼上:

apply plugin: 'org.jetbrains.kotlin.android.extensions'

android {
    androidExtensions {
        experimental = true
    }
}

在您的数据类中:

@Parcelize
data class Student(val id: String, val name: String, val grade: String) : Parcelable

在源活动中:

val intent = Intent(context, Destination::class.java)
        intent.putExtra("student_id", student)
        context.startActivity(intent)

在目标活动中:

student = intent.getParcelableExtra("student_id")

答案 3 :(得分:2)

这篇文章可能对你打算做的事情有用:

Is there a convenient way to create Parcelable data classes in Android with Kotlin?

基本上,kotlin提供了一些额外的东西:

@Parcelize
class User(val firstName: String, val lastName: String) : Parcelable

有关详细信息,请参阅帖子。

答案 4 :(得分:2)

我发现了使用Parcelable将对象一个活动传递给另一个活动的更好方法,它比序列化要快 Android: Difference between Parcelable and Serializable?

首先将这行代码添加到build.gradle(app)

android{
    androidExtensions {
            experimental = true
        }
}

我从 here那里得到了答案

@Parcelize 
class Model(val title: String, val amount: Int) : Parcelable

传递意图--->

val intent = Intent(this, DetailActivity::class.java)
intent.putExtra(DetailActivity.EXTRA, model)
startActivity(intent)

从意图中获取--->

val model: Model = intent.getParcelableExtra(EXTRA)

答案 5 :(得分:0)

在kotlin中开始活动并传递一些数据你可以尝试这样的事情:

startActivity(intentFor<NameOfActivity>(STRING to data))

玩得开心

答案 6 :(得分:0)

您的People类需要像这样实现Parcelable:

statement

android studio会显示错误。简单地将光标移动到“People”并按下alt + enter。它现在应该显示生成Parcelable实现的选项。

此生成的代码将包含类似

的内容
class People(): Parcelable{
// stuff


}

和其他地方

parcel.writeString(member1)
parcel.writeInt(member2)

确保所有成员都包含在这些方法中,并在修改时确保读取和写入的顺序完全相同。

答案 7 :(得分:0)

自Kotlin 1.3.60 + 起,

Parcelize不再处于实验阶段!

定义数据类,添加@Parcelize批注并扩展Parcelable

@Parcelize
data class People(val id: String, val name: String) : Parcelable

要添加到意图:

val intent = Intent(context, MyTargetActivity::class.java)
intent.putExtra("people_data", student)
context.startActivity(intent)

MyTargetActivity中:

val people: People = intent.getParcelableExtra("people_data")

如果尚未启用,请在应用程序的build.gradle中启用扩展程序。这也会启用data bindingother great advanced features

apply plugin: 'kotlin-android-extensions'

答案 8 :(得分:0)

你必须在<>中添加类型...它对我有用

val people = intent.getParcelableExtra<People>(EXTRA_PEOPLE) as People

在您的 PeopleDetailActivity 活动中,在 onCreate 中初始化 viewModel

viewModel = this@PeopleDetailActivity.viewModel.apply { postPeopleId(getPeopleFromIntent().id) }

还要初始化这个方法:

private fun getPeopleFromIntent() = intent.getParcelableExtra<People>(peopleId) as People

编写下面的代码以传递意图附加项:

companion object {
        private const val objectId = "people"
        fun startActivityModel(context: Context?, people: People) {
            if (context != null) {
                val intent = Intent(context, PeopleDetailActivity::class.java).apply {
                    putExtra(
                        objectId,
                        people
                    )
                }
                context.startActivity(intent)
            }
        }
    }

在您的 PeopleListViewHolder onClick 中调用上述方法

override fun onClick(v: View?) = PeopleDetailActivity.startActivityModel(context(), people)