arrays - 发送一个字符串数组并使用 parcelable kotlin 接收它
问题描述
我一直在尝试在 kotlin 中使用 parcel 发送一个字符串数组,我尝试了几件事,比如在使用 writeTypedArray 之前转换为数组,或者直接使用 writeStringArray。我还尝试使用 createTypedArray 和 createdStringArray 进行阅读。
在大多数情况下,我收到的内容是正确的(我的意思是数组内部没有改变),但在某些情况下它变成空值和数组中的某个链接。
我已经检查了我的代码,并在使用意图之前和之后打印它,这就是区别所在,所以我猜错误在于包裹
这是我表达我的意图的地方,当我调用 showGenres() 时,它显示了喜剧和生活片段等确切的流派
val anime : Anime = news.anime
val intent : Intent = Intent(holder.btnViewMore.context, DetailActivity::class.java)
news.anime.showGenres()
intent.putExtra("choosen", anime)
holder.btnViewMore.context.startActivity(intent)
但是,在我收到意图后,当我调用 showGenres 时,内容变为空值(其中大部分)和一些字符串,如“P�� https://s4.anilist.co/file/anilistcdn/media/anime/banner /104199-ha1rxhhOb8Yp.jpg ��������喜剧������切片”。
anime = intent.getParcelableExtra("choosen")
anime.showGenres()
以下是我使用 parcellable 的课程
package com.example.jnimekuy.Model
import android.os.Parcel
import android.os.Parcelable
import android.util.Log
class Anime(
var id: Int = 0,
var title: String? = "",
var image: String? = "",
var description: String? = "",
var status: String? = "",
var startDate: String? = "",
var endDate: String? = "",
var season: String? = "",
var episode: Int? = 1,
var duration: Int? = 1,
var trailer: String? = "",
var cover: String? = "",
var banner: String? = "",
var genreList: List<String>? = ArrayList(),
var avgScore: Float? = 1F
):Parcelable{
constructor(parcel: Parcel) : this(
parcel.readInt(),
parcel.readString(),
parcel.readString(),
parcel.readString()?.replace("<br>","",true),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readInt(),
parcel.readInt(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.createStringArrayList()?.filterNotNull(),
parcel.readFloat()
)
override fun writeToParcel(parcel: Parcel, p1: Int) {
parcel.writeInt(id)
parcel.writeString(title)
parcel.writeString(image)
parcel.writeString(description)
parcel.writeString(status)
parcel.writeString(startDate)
parcel.writeString(endDate)
parcel.writeString(season)
episode?.let { parcel.writeInt(it) }
duration?.let { parcel.writeInt(it) }
parcel.writeString(trailer)
parcel.writeString(cover)
parcel.writeString(banner)
parcel.writeStringList(genreList)
avgScore?.let { parcel.writeFloat(it) }
}
fun showGenres(){
for(i in this!!.genreList!!)
{
Log.d("genre",i)
}
}
override fun describeContents(): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
companion object CREATOR : Parcelable.Creator<Anime> {
override fun createFromParcel(parcel: Parcel): Anime {
return Anime(parcel)
}
override fun newArray(size: Int): Array<Anime?> {
return arrayOfNulls(size)
}
}
}
解决方案
好的,我发现了问题,因为我使用 let ,如果不是 null 则发送一些东西,然后如果它为 null ,它不发送任何东西,但仍然被包裹构造函数打开。写入和类型字符串数组没有任何问题。我所做的是把 if null 然后仍然发送一些东西
parcel.writeInt(id)
parcel.writeString(title)
parcel.writeString(image)
parcel.writeString(description)
parcel.writeString(status)
parcel.writeString(startDate)
parcel.writeString(endDate)
parcel.writeString(season)
if(episode != null){ parcel.writeInt(episode!!) }
else { parcel.writeInt(0) }
if(duration != null){ parcel.writeInt(duration!!) }
else { parcel.writeInt(0) }
parcel.writeString(trailer)
parcel.writeString(cover)
parcel.writeString(banner)
parcel.writeStringList(genreList)
avgScore?.let { parcel.writeFloat(it)
推荐阅读
- video - FFMPEG 如何使用循环、缩放、叠加位置向 mp4 视频添加 gif 水印
- javascript - JS:拒绝可以排除在承诺之外吗?
- webrtc - 如何将原始数据从网络音频流式传输到 webrtc 数据通道
- ios - 如何从 Realm 中的 2 个表中获取数据
- android - 如何使用 Firebase 仅使用电话号码和 otp 实现现有用户登录
- c++ - 元组的可变参数模板被反转
- ssl - 使用 .crt 文件和 ca 签名证书生成 .jks 文件
- java - 如何将图片从imageview发送到gmail?
- laravel - 在 AWS Serverless 平台上部署 Laravel (laravel-mix) 应用程序
- python - 获取用户输入时,我想检查两个值,但是,我使用的代码不断循环