Kotlin-Parcelable遇到的坑,Parcelize使用

我们在页面间跳转时,经常需要传递值,在使用Java中我们实现Parcelable接口,实现响应方法即可。然而我在使用Kotlin的时候,遇到了点问题,问题如下:
问题
1.创建2个Activity,分别是MainActivity和Main2Activity,点击MainActivity上的Button,跳转到Main2Activity,并且传递我们的Bean。
2.创建MainActivity
MainActivity中跳转:
btn.setOnClickListener({
val intent = Intent(this, Main2Activity::class.java)
val user = User(“jzd”, 100)
intent.putExtra(“user”, user)
val bean = DispatchRecordBean(“id”, “plateNumber”, “createTime”, “reason”, “startTime”,
“endTime”, “recipient”, “model”, “carColor”, “carBrands”, “carCategory”, “carYear”, 10)
intent.putExtra(“bean”, bean)
startActivity(intent)
})
User对象:
data class User(val name: String, val age: Int) : Parcelable
{
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readInt())
{
}
override fun writeToParcel(parcel: Parcel, flags: Int)
{
parcel.writeString(name)
parcel.writeInt(age)
}
override fun describeContents(): Int
{
return 0
}
companion object CREATOR : Parcelable.Creator<User>
{
override fun createFromParcel(parcel: Parcel): User
{
return User(parcel)
}
override fun newArray(size: Int): Array<User?>
{
return arrayOfNulls(size)
}
}
}
DispatchRecordBean对象:
data class DispatchRecordBean(var id: String, var plateNumber: String, var createTime: String, var reason: String,
var startTime: String, var endTime: String, var recipient: String, var carModel: String, var carColor: String, var carBrands: String, var carCategory: String,
var carYear: String, var dispatchType: Int) : Parcelable
{
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readInt())
override fun writeToParcel(parcel: Parcel, flags: Int)
{
parcel.writeString(id)
parcel.writeString(plateNumber)
parcel.writeString(createTime)
parcel.writeString(reason)
parcel.writeString(startTime)
parcel.writeString(endTime)
parcel.writeString(recipient)
parcel.writeString(carModel)
parcel.writeString(carColor)
parcel.writeString(carBrands)
parcel.writeString(carCategory)
parcel.writeString(carYear)
parcel.writeInt(dispatchType)
}
override fun describeContents(): Int
{
return 0
}
companion object CREATOR : Parcelable.Creator<DispatchRecordBean>
{
override fun createFromParcel(parcel: Parcel): DispatchRecordBean
{
return DispatchRecordBean(parcel)
}
override fun newArray(size: Int): Array<DispatchRecordBean?>
{
return arrayOfNulls(size)
}
}
}
3.Main2Activity中接收:
val user = intent.getParcelableExtra<User>(“user”)
mTvName.text = user?.name
mTvAge.text = user?.age.toString()
val bean = intent.getParcelableExtra<DispatchRecordBean>(“bean”)
mTvId.text = bean?.dispatchType.toString()
4.问题就是,我的User对象可以正常传值,而我的Dispatch对象就不能正常传递,Debug看一下代码,发现在Dispatch类的constructor方法中,parcel.readString()取值是跳跃式的取值,正常应该是按照id->plateNumber->createTime->reason->startTime->endTime->recipient->carModel->carColor->carBrands->carCategory->carYear->dispatchType,而Debug发现,parcel.readString()取到的值是id->createTime->startTime->recipient..这样的,到了后面字段值都取不到了,难道是一次取了2个值?在修改Dispatch代码时,发现取值情况还会变化,真的是一头雾水…到现在也不知道是什么情况,最好换成了Parcelize方式传值,解决了问题。
那么接下来说一下Parcelize怎么传递值:
Parcelize传值
在Module的build.gradle中添加:
apply plugin: ‘kotlin-android-extensions’
android
{
androidExtensions {
experimental = true
}
}
修改Dispatch代码,添加Parcelize注解,最后Dispatch代码如下:
@SuppressLint(“ParcelCreator”)
@Parcelize
data class DispatchRecordBean(var id: String, var plateNumber: String, var createTime: String, var reason: String,
var startTime: String, var endTime: String, var recipient: String, var carModel: String, var carColor: String, var carBrands: String, var carCategory: String,
var carYear: String, var dispatchType: Int) : Parcelable
问题迎刃而解,暂时还是使用Parcelize注解传递值吧

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/6181,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?