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类型的人物对象,但是收到错误。 请帮我解决这个问题。
答案 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)
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 binding和other 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)