android - 有时在使用 parceble 创建片段时会发生错误
问题描述
我正在使用 Parcelable 创建一个框架。
在大多数情况下并没有错,
但在 firebase Crashlytics 报告中,我得到一个 Unmarshalling unknown type code 异常。
我不确定为什么会收到该错误。
下面是我的代码。
数据类
class MovieNew(
val Url: String,
val movieDetail : ArrayList<MovieDetail>,
val imageSrc : String,
val brandImageSrc : String,
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
arrayListOf<MovieDetail>().apply {
parcel.readList(this, MovieDetail::class.java.classLoader)
},
parcel.readString(),
parcel.readString()) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(Url)
parcel.writeList(movieDetail)
parcel.writeString(imageSrc)
parcel.writeString(brandImageSrc)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<MovieNew> {
override fun createFromParcel(parcel: Parcel): MovieNew {
return MovieNew(parcel)
}
override fun newArray(size: Int): Array<MovieNew?> {
return arrayOfNulls(size)
}
}
}
适配器
class ContentsNewListFragmentAdapter(fm: androidx.fragment.app.FragmentManager, var movieList: ArrayList<MovieNew>, var brandList : ArrayList<BrandList>) : androidx.fragment.app.FragmentStatePagerAdapter(fm) {
private var listener: MainActivityListener? = null
override fun getItem(position: Int): androidx.fragment.app.Fragment {
val tabPosition : Int = Utils.setBrandNum(brandList ,movieList[position].brandId.toInt())
val fragment = ContentsNewListFragment.newInstance(movieList[position],tabPosition)
fragment.setMainListener(listener)
return fragment
}
分段
class ContentsNewListFragment : androidx.fragment.app.Fragment() {
private var model: MovieNew? = null
private var tabPostion : Int? = null
private var listener: MainActivityListener? = null
companion object {
fun newInstance(model : MovieNew, tabPostion : Int): ContentsNewListFragment {
val args = Bundle()
val fragment = ContentsNewListFragment()
if (model != null){
args.putParcelable("model", model)
args.putInt("tabPosition", tabPostion)
fragment.arguments = args
}
return fragment
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null) {
model = arguments?.getParcelable("model")
tabPostion = arguments?.getInt("tabPosition")
}
}
如果您知道解决方案,请告诉我。
解决方案
MovieDetail 类怎么样,你在那里也实现了 Parcelable 吗?所有字段都必须是可包裹的。
另外不知道大家知不知道,不用手动“打包”,有
@Parcelize
注解,只要注解你要打包的类,实现Parcelable接口,但不用写任何实现手动。条件是主要的构造函数参数也都是可打包的。
推荐阅读
- python - python多变量线性回归
- objectgears - 配置数据库基线 - //CheckDifferentData('cpu', OGActualDataRow, OGDataRows);
- java - Java async order
- angular - 如何显示不同的数据
如果用户在使用 Angular 时登录/注销? - playframework - 如何在 Play 中的所有响应中设置标题!框架 2.7 (Java)
- amazon-web-services - AWS IAM Groups naming strategy
- flutter - Flutter:容器内的垂直滚动
- javascript - 我使用了 HTML + JAVAScript,但我只能看到 JAVAScript
- python - 没有 response.history 的 Python Unshort URL
- java - How to add "WITH" clause to SELECT query with sqlbuilder