android - 如何将 lambda 作为 Intent 的额外内容传递?

标签 android android-studio kotlin android-intent android-recyclerview

我是 kotlin 和 Android 的新手,我正在研究 recyclerView 但遇到了一些小问题。
基本上我有,
+ 2 个 Activity ,MainActivity 包含一个 recyclerView 和 fullDetails Activity ,通过 onClick 打开 recyclerView 的每个票证,
Activity A & Activity B
Fab 展示展示了每个项目独有的功能,如本例中的 Toast。
+对象的 ArrayList,临时菜单列表 选项 类(class),
+该类包含几个字符串和一个 lambda 变量 actionOfItem 因为我想为每个对象提供单独的功能,
+我正在尝试通过 OnClick 监听器将 lambda 传递为可序列化的 Intent ,如下所示:

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

+在 Activity B 上,我得到这样的 lambda 并尝试调用该函数,因为这使我的应用程序崩溃,我单独创建了 行动 lambda 的类,以便我可以将 getSerializable() 编写为操作类的对象。
val action=bundle.getSerializable("function") as actions?
fabShow.setOnClickListener{
          action?.action
    }

现在应用程序加载了 MainActivity,但是当按下 RecyclerView 的 OnClickListner 时崩溃。
我知道我的命名非常糟糕和困惑,我不使用评论,
但是有没有办法通过一个 Intent 为每个对象传递一个独特的函数?
编辑 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

最佳答案

Runnables 不可序列化。您不能简单地将任何内容转换为 Serializable 以使其可序列化——这是您必须实现的接口(interface)。而且你不能序列化对象引用,所以不可能用函数来做到这一点。

您的数据(在本例中为 tempMenuList)应位于 ViewModel 中。应将 Activity 转换为位于同一 Activity 中的 fragment 。第一个 Fragment 可以简单地通过 Intent 传递列表中项目的 Int 索引,第二个 Fragment 可以检索项目及其 action从 View 模型。

关于android - 如何将 lambda 作为 Intent 的额外内容传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60229468/

相关文章:

android - 在 ScrollView 屏幕底部定位按钮并设置比例宽度

java - Android Studio 找不到 JAVA_HOME

android - jackson 在反序列化期间更改日期

android - 使用底部片材支架中的底部片材调整内容高度

android - 在 Android 中以编程方式添加 FilterChips

android - GCM getToken() 发送 java.io.IOException : TIMEOUT

android - 如何让 UI 线程等待后台线程完成?

Android 偏好子屏幕

android - 将图像导入Android Studio,图像显示为深灰色

android - Android Studio完全离线