首页 > 解决方案 > 有时在使用 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")
        }

    }

如果您知道解决方案,请告诉我。

标签: androidandroid-fragmentsparcelable

解决方案


MovieDetail 类怎么样,你在那里也实现了 Parcelable 吗?所有字段都必须是可包裹的。

另外不知道大家知不知道,不用手动“打包”,有 @Parcelize注解,只要注解你要打包的类,实现Parcelable接口,但不用写任何实现手动。条件是主要的构造函数参数也都是可打包的。


推荐阅读