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

How to Pass custom object via intent in kotlin

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 class 的实例,但我收到了一个错误。 我做错了什么?

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

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

玩得开心

你的人 class 需要像这样实现 Parcelable:

class People(): Parcelable{
// stuff


}

android studio 会显示一个错误。只需将光标移动到 "People" 并按 alt+enter。它现在应该显示生成 Parcelable 实现的选项。

此生成的代码将包含类似

的内容
parcel.writeString(member1)
parcel.writeInt(member2)

和其他地方

member1=parcel.readString()
member2=parcel.readInt()

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

首先,确保 People class 实现了 Serializable 接口:

class People : Serializable {
    // your stuff
}

People class 的内部字段也必须实现 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 = intent.getSerializableExtra(EXTRA_PEOPLE) as? People

此 post 可能对您打算执行的操作有用:

基本上,kotlin 提供了一些额外的功能:

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

有关详细信息,请参阅 post。

找到更好的方法:

在你的gradle中:

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

android {
    androidExtensions {
        experimental = true
    }
}

在你的数据中class:

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

来源activity:

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

目的地activity:

student = intent.getParcelableExtra("student_id")

在对象中实现可序列化:

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

我找到了一种使用 Parcelable 将对象从一个 activity 传递到另一个的更好方法,它比序列化更快 Android: Difference between Parcelable and Serializable?

首先,在build.gradle(app)

中添加这几行代码
apply plugin: 'kotlin-android-extensions' in app.grable 

@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)

Parcelize 不再是实验性的,从 Kotlin 开始 1.3.60+!

定义一个数据class,添加@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 binding and other great advanced features

apply plugin: 'kotlin-android-extensions'

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

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

在您的 PeopleDetailActivity activity 中,在 onCreate

中初始化 viewModel
viewModel = this@PeopleDetailActivity.viewModel.apply { postPeopleId(getPeopleFromIntent().id) }

同时初始化这个方法:

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

编写下面的代码来传递 intent extras :

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)