如何通过 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)
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
中初始化 viewModelviewModel = 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)