我如何接收可包裹包裹?
How do I receive parcelable bundles?
我创建了这样一个包:
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
中的class对象是Parcelized
,看起来像这样:
@SuppressLint("ParcelCreator")
@Parcelize
class RecipeTemplate: Parcelable {
var recipeHeader: String? = null
var recipeText: String? = null
var recipeImage: String? = null
var recipeKey: String? = null
}
到目前为止一切顺利。但是当我在另一个 activity 中收到 bundle 时,由于某种原因它 returns null,即使我使用与上面相同的代码(测试代码以查看 bundle 是否存储了正确的数据)。这是接收activity:
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 变量 returns 是正确的数据,但 recipeArray
由于某种原因为空。同样,它在之前的 activity 中有效,所以我不明白这次有什么不同......有什么想法吗?
更新
如果我将光标悬停在 class 中的变量上,它会显示:Property not serialized as parcel
。听起来好像事情没有按我的预期进行...是什么原因?
尝试重构 RecipeTemplate 以接受属性作为构造函数中的参数。
@SuppressLint("ParcelCreator")
@Parcelize
class RecipeTemplate (
var recipeHeader: String? = null,
var recipeText: String? = null,
var recipeImage: String? = null,
var recipeKey: String? = null
) : Parcelable
问题可能出在parcelize的实现方式上。我找不到与此相关的任何文档,但 createFromParcel 很有可能只调用主构造函数。这仍然是实验性的,将来可能会改变。虽然我可能是错的,但我很高兴得到纠正。
我创建了这样一个包:
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
中的class对象是Parcelized
,看起来像这样:
@SuppressLint("ParcelCreator")
@Parcelize
class RecipeTemplate: Parcelable {
var recipeHeader: String? = null
var recipeText: String? = null
var recipeImage: String? = null
var recipeKey: String? = null
}
到目前为止一切顺利。但是当我在另一个 activity 中收到 bundle 时,由于某种原因它 returns null,即使我使用与上面相同的代码(测试代码以查看 bundle 是否存储了正确的数据)。这是接收activity:
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 变量 returns 是正确的数据,但 recipeArray
由于某种原因为空。同样,它在之前的 activity 中有效,所以我不明白这次有什么不同......有什么想法吗?
更新
如果我将光标悬停在 class 中的变量上,它会显示:Property not serialized as parcel
。听起来好像事情没有按我的预期进行...是什么原因?
尝试重构 RecipeTemplate 以接受属性作为构造函数中的参数。
@SuppressLint("ParcelCreator")
@Parcelize
class RecipeTemplate (
var recipeHeader: String? = null,
var recipeText: String? = null,
var recipeImage: String? = null,
var recipeKey: String? = null
) : Parcelable
问题可能出在parcelize的实现方式上。我找不到与此相关的任何文档,但 createFromParcel 很有可能只调用主构造函数。这仍然是实验性的,将来可能会改变。虽然我可能是错的,但我很高兴得到纠正。