如何通过lambda作为Intent的额外内容?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过lambda作为Intent的额外内容?相关的知识,希望对你有一定的参考价值。

我是Kotlin和android的新手,我一直在研究recyclerView,但遇到了一些麻烦。基本上我有+ 2个活动,MainActivity包含一个recyclerView和fullDetails活动,该活动通过onClick在recyclerView的每个票证上打开,Activity AActivity BFab秀展示了每个项目所独有的功能,例如本例中的Toast。+对象的ArrayList,options类的tempMenuList,+该类包含一些字符串和一个lambda变量actionOfItem,因为我想为每个对象提供单独的功能,+我试图通过这样的意图将lambda作为可序列化的对象传递给OnClick侦听器:

val intent=Intent(context,fullDetails::class.java)
intent.putExtra("action",RunnabletempMenuList[position].actionOfItem as java.io.Serializable)

+在活动B上,我得到了这样的lambda并尝试调用该函数,因为这使我的应用程序崩溃了,我为lambda创建了一个单独的actions类,以便可以将getSerializable()编写为actions类的对象。

val action=bundle.getSerializable("function") as actions?
fabShow.setOnClickListener
          action?.action
    

现在该应用程序加载MainActivity,但是当按下RecyclerView的OnClickListner时会崩溃。我知道我的命名很糟糕而且令人困惑,而且我不使用评论,但是有什么方法可以通过意图为每个对象传递唯一的功能吗?编辑1:我读到我可以使用SharedPreferences来做到这一点,但是不建议这样做。这是Logcat:

java.lang.ClassCastException: com.example.androidreferenceapp.MainActivity$menuAdapter$onBindViewHolder$1$1 cannot be cast to java.io.Serializable
    at com.example.androidreferenceapp.MainActivity$menuAdapter$onBindViewHolder$1.onClick(MainActivity.kt:58)
    at android.view.View.performClick(View.java:6605)
    at android.view.View.performClickInternal(View.java:6582)
    at android.view.View.access$3100(View.java:778)
    at android.view.View$PerformClick.run(View.java:25897)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6762)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Here's the full Source Code if that helps

答案

可运行对象不可序列化。您不能简单地将任何内容强制转换为Serializable使其可序列化-这是您必须实现的接口。而且您无法序列化对象引用,因此将无法通过函数来​​完成此操作。

另一答案

您正在尝试做的是反模式。如果可能,您应该将lambda作为参数传递给recyclerview的适配器。例如

以上是关于如何通过lambda作为Intent的额外内容?的主要内容,如果未能解决你的问题,请参考以下文章

列出 Intent 的所有额外内容

PendingIntent 不发送 Intent 额外内容

无法在 ViewModel 中的 Intent 中添加额外内容

为已被 Home 按钮暂停的应用程序的 Intent 添加额外内容

如何使用 intent.putextra 设置 videoview 资源

Kotlin - 通过 Intent 将函数作为参数传递