Android 如何在kotlin中通过intent传递自定义对象
我尝试使用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, (
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)