Android 如何在kotlin中通过intent传递自定义对象

Android 如何在kotlin中通过intent传递自定义对象,android,android-intent,kotlin,kotlin-android-extensions,Android,Android Intent,Kotlin,Kotlin Android Extensions,我尝试使用kotlin通过intent传递People类的一个实例,但是我得到了一个错误。 我做错了什么?在kotlin中要启动活动并传递一些数据,您可以尝试以下操作: fun launchNextScreen(context: Context, people: People): Intent { val intent = Intent(context, NextScreenActivity::class.java) intent.putExtra(EXTRA_PEOPLE, (

我尝试使用kotlin通过intent传递
People
类的一个实例,但是我得到了一个错误。
我做错了什么?

在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
}
startActivity(意图(字符串到数据))


玩得开心

您的人员类需要实现如下Parcelable:

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
}
android studio将向您显示一个错误。只需将光标移动到“People”并按alt+enter。它现在应该显示生成可包裹实现的选项

生成的代码将包含以下内容

class People(): Parcelable{
// stuff


}
还有别的地方

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

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

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

member1=parcel.readString()
member2=parcel.readInt()
People
类的内部字段也必须实现
Serializable
接口,否则会出现运行时错误

那么它应该会起作用:

class People : Serializable {
    // your stuff
}
要从Intent接回人员,您需要致电:

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

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

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

val people = intent.getSerializableExtra(EXTRA_PEOPLE) as? People

有关更多信息,请参阅帖子。

找到了更好的方法:

在你的毕业典礼上:

apply插件:“org.jetbrains.kotlin.android.extensions”
安卓{
androidExtensions{
实验=真实
}

}
在对象中实现可序列化:

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

然后,可以使用意图传递对象:

class Object : Serializable {
        var param1: Int? = null,
        var param2: String? = null
}
最后,在Activity2中,您可以通过以下方式获得对象:

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

我发现了一种更好的方法,使用Parcelable将对象从一个活动传递到另一个活动,它比序列化更快

首先,在build.gradle(应用程序)中添加这些代码行

我从你那里得到了答案

故意传球--->

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)
从意图中获得-->

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)
从Kotlin1.3.60+开始,Parcelize不再是实验性的! 定义一个数据类,添加
@Parcelize
注释并扩展
Parcelable

增加意图:

val intent=intent(上下文,MyTargetActivity::class.java)
intent.putExtra(“人员数据”,学生)
上下文。起始触觉(意图)
MyTargetActivity
中:

@Parcelize
data class People(val id: String, val name: String) : Parcelable
如果尚未启用,请在应用程序的
build.gradle
中启用扩展。这也使得


你必须在里面加上这个字…它对我有用

val people=intent.getParcelableExtra(EXTRA_people)作为人

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

apply plugin: 'kotlin-android-extensions'
并初始化此方法:

viewModel = this@PeopleDetailActivity.viewModel.apply { postPeopleId(getPeopleFromIntent().id) }
在PeopleListViewHolder onClick中调用上述方法

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

您得到的错误到底是什么?以及如何在另一个类中接收数据?如何在其他活动中获取可序列化类?@VikashParajuli在本例中,您需要调用
val people=getIntent().getExtras().getSerializableTextra(EXTRA_people)as?人员
速度较慢,您需要使用Parcelable以提高效率performance@a2en这是每个人都在说的话,但没有人确切知道)在小物体上,你看不到任何区别。但是,有一种方法可以使序列化比可打包更快,有关更多信息,请参阅Farhana在本帖中的回答:这是可行的,但您必须在build.gradle:apply plugin:'org.jetbrains.kotlin.android.extensions'android{androidExtensions{experimental=true}中设置它。好消息!!它不再是实验性的,这是每个人都在说的,但没有人确切知道)在小物体上你看不到任何区别。还有,很高兴有这种Kotlin糖,但是好的旧爪哇怎么样?但是,有一种方法可以使序列化比可打包更快,有关更多信息,请参阅此线程中的Farhana答案:解决方案更干净、更简单。
kotlin android extensions
现在已被弃用,您应该为使用
kotlin parcelize
插件。如果自定义对象是可打包的,这将只起作用。如果您能提供一些示例代码,那就太好了。请使用@Marcelhoffesang示例编辑答案
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)
            }
        }
    }
override fun onClick(v: View?) = PeopleDetailActivity.startActivityModel(context(), people)