簡體   English   中英

將包裹從活動A傳遞到活動B-getExtra為空

[英]Passing Parcelable from Activity A to Activity B - getExtra is null

當我使用Intent於通過Parcelable從活動A對象到活動B,B的活性getExtra為空。 按照我的代碼:

class A(var id: Int, var name: String,var bList:MutableList<B>) : Parcelable {
    override fun writeToParcel(p0: Parcel, p1: Int) {
        p0.writeInt(id)
        p0.writeString(name)
        p0.writeTypedList(bList)
    }

    override fun describeContents(): Int {
        return 0
    }

    constructor(parcel: Parcel) : this(
            parcel.readInt(),
            parcel.readString(),
            parcel.createTypedArrayList(B.CREATOR)

    )

    companion object CREATOR : Parcelable.Creator<A> {
        override fun createFromParcel(parcel: Parcel): A {
            return A(parcel)
        }

        override fun newArray(size: Int): Array<A?> {
            return arrayOfNulls(size)
        }
    }
}

B級

class B(var id: Int, var name: String, var a: A) : Parcelable {
    constructor(parcel: Parcel) : this(
            parcel.readInt(),
            parcel.readString(),
            parcel.readParcelable(A::class.java.classLoader))

    override fun writeToParcel(p0: Parcel, p1: Int) {
        p0.readInt()
        p0.readString()
        p0.readParcelable<A>(A.javaClass.classLoader)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<B> {
        override fun createFromParcel(parcel: Parcel): B {
            return B(parcel)
        }

        override fun newArray(size: Int): Array<B?> {
            return arrayOfNulls(size)
        }
    }
}

我使用意圖來傳遞數據:

val list = mutableListOf<B>()
val a = A(1,"A",list)
val b1 = B(1,"B1",a)
val b2 = B(2,"B2",a)
list.add(b1)
list.add(b2)
val intent = Intent()
intent.setClass(context, AboutActivity::class.java)
intent.putExtra("frank",a)
startActivity(intent)

我正在使用以下代碼來檢索數據:

val bundle = intent.extras
val a:A = bundle.getParcelable("frank")

編寫Parcelable時,此數據結構是否為死循環?

您遇到了兩個問題。

首先,類B上的writeToParcel()函數正在讀取而不是寫入。 您最有可能打算這樣做:

override fun writeToParcel(p0: Parcel, p1: Int) {
    p0.writeInt(id)
    p0.writeString(name)
    p0.writeParcelable(a, 0)
}

進行更改后,您將遇到第二個問題:由於模型之間存在相互依賴關系,因此會出現堆棧溢出錯誤。 A依賴於B對象的列表,每個對象都再次引用了A對象。 Android的包裹代碼不支持這種循環依賴關系

大約在此之前,有一張錯誤單被打開,但是它的狀態被標記為Won't Fix (Infeasible)

另一篇SO文章中提到了一些變通方法,但總的來說,最好是盡可能避免循環依賴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM