是否可以在一个意图中存储来自两个不同的可打包数据 类 的数据以启动一个新的 Activitiy?

Is it possible to store data from two different parcelable data classes in one single intent to start a new Activitiy with it?

经过大量研究后,我无法找到真正解决问题的方法。大多数答案基于将单个可打包对象附加到一个意图并从中开始一个新的 activity。

在我的例子中,我使用来自两个不同的 parcelable classes 的数据。我有两个不同的 RecyclerView Adapter classes,它们位于同一个 activity.

因此,当用户单击来自第一个(父)适配器 class 的数据集时,视图会显示来自第二个适配器 class 的所有可用(子)数据集。

我想保存用户最先点击的父对象数据集,以及用户最后长按的子对象数据集。这两个对象需要以相同的意图附加,完成后,应该启动一个新的 activity。来自两个对象(父对象和子对象)的数据必须在新活动中传递。

为了清楚起见,我只发布了代码的相关部分。

这是父适配器 class 的一部分,我需要将对象数据保存到某种 "global" 意图中,我的代码只会生成一个本地意图(这就是为什么它是仅评论)。

                itemView.setOnClickListener {
                notifyItemChanged(selectedPos)
                selectedPos = adapterPosition
                notifyItemChanged(selectedPos)
                listener.onHeadItemClicked(weKopf.WENR, p1)
                // save parent parcelable object data to "global" intent 
                // val intent = Intent(context, StorageGoodsActivity::class.java)
                // intent.putExtra("weKopf", weKopf)

            }

这是代码的一部分,我想将子对象数据附加到相同的意图,然后启动新的 activity。

                itemView.setOnLongClickListener{
                notifyItemChanged(selectedPos)
                selectedPos = adapterPosition
                notifyItemChanged(selectedPos)
                listener.onPositionLongClicked(wePos.lfdNr.toInt())
                /**
                 * setting-up for passing objects between activities
                 */
                val intent = Intent(context, StorageGoodsActivity::class.java)
                //intent.putExtra("weKopf", weKopf)
                intent.putExtra("wePos", wePos)
                context.startActivity(intent)
                true

最优雅的方法是什么?我的想法是将意图存储到一个共享组件中,但只要用户单击后退按钮 return 到旧的 activity 并在之后选择新的父子星座,这个意图就应该存在。如果是这样,这个创建的项目是否会被丢弃,或者它仍然存在于共享组件中?

我是 Android Studio 和 Kotlin 的新手,非常感谢您的帮助或建议。非常感谢你提前。

只要每个 Intent 都有自己的名称,您就可以在一个 Intent 中拥有任意数量的 extra。唯一的限制是 Intent 总大小的限制(大约 2 MB iirc)。

这个问题的解决方案有点小变通。不可能以相同的意图从两个适配器 类 附加数据对象,因为新的 activity 只能从一个适配器启动。 在这种情况下,我将数据对象从第一个(父)适配器传递给 SharedPreferences 对象,该对象被 Gson 转换为他的 JSON 表示形式。

itemView.setOnClickListener {
                notifyItemChanged(selectedPos)
                selectedPos = adapterPosition
                notifyItemChanged(selectedPos)
                listener.onHeadItemClicked(weKopf.WENR, p1)

                /**
                 * store object in SharedPreferences
                 */
                val sharedPreferences:SharedPreferences = context.getSharedPreferences("StoreHeadObj", MODE_PRIVATE)
                val editor : SharedPreferences.Editor = sharedPreferences.edit()
                val gson = Gson()
                val json = gson.toJson(weKopf)

                editor.putString("JSONString", json)
                editor.commit()

第二个(子)对象已通过意图传递,新的 Activity 已启动。

itemView.setOnLongClickListener{
                notifyItemChanged(selectedPos)
                selectedPos = adapterPosition
                notifyItemChanged(selectedPos)
                listener.onPositionLongClicked(wePos.lfdNr.toInt())
                /**
                 * setting-up for passing objects between activities
                 */                
                val intentPos = Intent(context, StorageGoodsActivity::class.java)                
                intentPos.putExtra("wePos",wePos)
                context.startActivity(intentPos)

                true
}

在新的 Activity 中,我正在从两个对象中检索数据。首先,我将 JSON 字符串转换为数据对象,然后从 Intent 中取出数据。因此,两个可打包数据对象现在都可以在新 Activity 中使用了。

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(getContentView())

        /**
         * get data from clicked weKopf-Object using Gson, at the end clear SharedPreferences
         */
        val sharedPreferences:SharedPreferences = getSharedPreferences("StoreHeadObj", Context.MODE_PRIVATE)
        val gson = Gson()
        val json:String = sharedPreferences.getString("JSONString", "")
        val weKopf:WeKopf = gson.fromJson(json, WeKopf::class.java)
        /**
         * get data from long-clicked wePos-Object using Intent
         */
        val extras = getIntent().getExtras()
        val wePos = extras.getParcelable<WePos>("wePos")
}