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

Ank*_*mar 24 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
}
Run Code Online (Sandbox Code Playgroud)

试过上面的代码,通过使用kotlin通过intent传递People类型的对象,但是得到了错误.请帮我解决这个问题.

A. *_*huk 38

首先,确保SerializablePeople-s类中实现:

class People : Serializable {
//your stuff
}
Run Code Online (Sandbox Code Playgroud)

确保你的内部字段People也实现Serializable接口,否则你将得到运行时错误.

然后它应该工作:

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

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

val people = intent.getSerializableExtra(EXTRA_PEOPLE) as? People
Run Code Online (Sandbox Code Playgroud)

  • @VikashParajuli在这个例子的上下文中你需要调用`val people = getIntent().getExtras().getSerializableExtra(EXTRA_PEOPLE)为?People` (3认同)
  • 它速度较慢,您需要使用 Parcelable 以获得更好的性能 (2认同)

Gib*_*olt 18

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

定义一个数据类,添加@Parcelize注解并扩展Parcelable

@Parcelize
data class People(val id: String, val name: String) : Parcelable
Run Code Online (Sandbox Code Playgroud)

添加到意图:

@Parcelize
data class People(val id: String, val name: String) : Parcelable
Run Code Online (Sandbox Code Playgroud)

MyTargetActivity

val people: People = intent.getParcelableExtra("people_data")
Run Code Online (Sandbox Code Playgroud)

如果您还没有,请在您的应用程序的build.gradle. 这也启用了数据绑定其他强大的高级功能

apply plugin: 'kotlin-android-extensions'
Run Code Online (Sandbox Code Playgroud)

  • `kotlin-android-extensions` 现已弃用,您应该使用 [Parcelable 实现生成器](https://developer.android.com/kotlin/parcelize) 的 `kotlin-parcelize` 插件。 (2认同)

fir*_*b86 17

在对象中实现Serializable:

data class Object (
        var param1: Int? = null,
        var param2: String? = null
) : Serializable
Run Code Online (Sandbox Code Playgroud)

要么

class Object : Serializable {
        var param1: Int? = null,
        var param2: String? = null
}
Run Code Online (Sandbox Code Playgroud)

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

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

最后,在Activity2中,您将获得以下对象:

val object = intent.extras.get("extra_object") as Object
Run Code Online (Sandbox Code Playgroud)


Ank*_*mar 11

找到了一种更好的方法:

在你的gradle中:

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

android {
    androidExtensions {
        experimental = true
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的数据类中:

@Parcelize
data class Student(val id: String, val name: String, val grade: String) : Parcelable
Run Code Online (Sandbox Code Playgroud)

在源活动中:

val intent = Intent(context, Destination::class.java)
        intent.putExtra("student_id", student)
        context.startActivity(intent)
Run Code Online (Sandbox Code Playgroud)

在目标活动中:

val intent = Intent(context, Destination::class.java)
        intent.putExtra("student_id", student)
        context.startActivity(intent)
Run Code Online (Sandbox Code Playgroud)


Ash*_*eez 8

我找到了一种使用 Parcelable 将对象从一个活动传递到另一个活动的更好方法,它比 Serialization Android更快 :Parcelable 和 Serializable 之间的区别?

首先,在 build.gradle(app) 中添加这些代码行

我从这里得到了答案

apply plugin: 'kotlin-android-extensions' in app.grable 

@Parcelize 
class Model(val title: String, val amount: Int) : Parcelable
Run Code Online (Sandbox Code Playgroud)

通过 Intent --->

val intent = Intent(this, DetailActivity::class.java)
intent.putExtra(DetailActivity.EXTRA, model)
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)

从意图中获取 --->

val model: Model = intent.getParcelableExtra(EXTRA)
Run Code Online (Sandbox Code Playgroud)