我如何收到包裹包裹?

时间:2018-07-03 05:50:30

标签: android android-intent bundle parcelable

我创建了一个这样的包:

val intent = Intent(classContext, Recipes::class.java)

var bundle = Bundle().apply {
                    putParcelableArrayList("LIST", ArrayList<Parcelable>(fbModel.recipeArray))
                    putInt("POSITION", position)
                }

intent.putExtra("bundle", bundle)

//CHECK TO SEE IF DATA IS STORED
var passedIntent = intent.extras
var bundle2: Bundle = passedIntent.getBundle("bundle")
var recipeArray: ArrayList<RecipeTemplate> = bundle2.getParcelableArrayList("LIST")

Log.d("TAGC", " " + recipeArray[0].recipeHeader) //SUCCESS!
Log.d("TAGC", " " + position)                    //SUCCESS!


startActivity(intent)

要查看其是否有效,我从bundle创建并记录了变量,它们确实包含正确的数据。

存储在数组RecipeTemplate中的类对象为Parcelized,看起来像这样:

@SuppressLint("ParcelCreator")
@Parcelize
class RecipeTemplate: Parcelable {
    var recipeHeader: String? = null
    var recipeText: String? = null
    var recipeImage: String? = null
    var recipeKey: String? = null
}

到目前为止,一切都很好。但是,当我在其他活动中收到捆绑包时,由于某种原因,即使我使用与上面相同的精确代码(测试代码以查看捆绑包是否存储了正确的数据),它也会返回null。这是接收活动:

var passedIntent: Bundle = intent.extras
var bundle = passedIntent.getBundle("bundle")
var counter: Int = bundle.getInt("POSITION", 0)
var recipeArray: ArrayList<RecipeTemplate> = bundle.getParcelableArrayList("LIST")

Log.d("TAGA", "PASSED " + counter) //SUCCESS
Log.d("TAGA", "PASSED " + recipeArray[0].recipeHeader) //FAIL: null

counter / position变量返回正确的数据,但是由于某些原因recipeArray为null。同样,它在上一个活动中有效,所以我不知道为什么这次不同...有什么想法吗?

更新 如果将光标悬停在类中的变量上,它将显示:Property not serialized as parcel。听起来好像事情没有按照我的预期去做...产生了什么?

1 个答案:

答案 0 :(得分:1)

尝试重构您的RecipeTemplate来接受属性作为构造函数中的参数。

@SuppressLint("ParcelCreator")
@Parcelize
class RecipeTemplate (
    var recipeHeader: String? = null,
    var recipeText: String? = null,
    var recipeImage: String? = null,
    var recipeKey: String? = null
) : Parcelable

问题可能出在实现包裹的方式上。我找不到与此有关的任何文档,但是createFromParcel很可能仅调用主构造函数。这仍然是实验性的,将来可能会改变。不过我可能错了,很高兴得到纠正。