android - 有没有办法在 Activity 之间传递函数引用?

标签 android kotlin

有没有办法在 Kotlin 和 Android 中 bundle 函数引用,以便可以从其他 fragment 调用函数? 例如,我的 fragment 工厂方法如下所示:

    fun newInstance(tryAgainFunction: () -> Unit): TimeOutHandlerFragment {
        val fragment = TimeOutHandlerFragment()
        val bundle = Bundle()

        return fragment
    }

我希望能够将我的 tryAgainFunction 保存在包中以供进一步检索。

非常感谢!

编辑

最后,最合适的解决方案是使用热键的答案,然后在 onViewCreated 我用传递的函数初始化一个监听器。完整代码如下:

companion object {
    val CALLBACK_FUNCTION: String = "CALLBACK_FUNCTION"

    fun newInstance(tryAgainFunction: () -> Unit): TimeOutHandlerFragment {
        val fragment = TimeOutHandlerFragment()
        val bundle = Bundle()
        bundle.putSerializable(CALLBACK_FUNCTION, tryAgainFunction as Serializable)
        fragment.arguments = bundle
        return fragment
    }
}

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    try {
        val callback: () -> Unit = arguments.getSerializable(CALLBACK_FUNCTION) as () -> Unit
        btnTryAgain.setOnClickListener { callback.invoke() }
    } catch (ex: Exception) {
        // callback has a wrong format
        ex.printStackTrace()
    }
}

感谢大家的帮助!

最佳答案

如果 tryAgainFunctionSerializable,则 you can put it into the bundle使用 bundle.putSerializable("try_again_function", tryAgainFunction);.

如果它是函数引用 (SomeClass::someFunction) 或 lambda,它实际上是 Serializable。但它可能不是,如果它是功能接口(interface) () -> Unit 的一些自定义实现,所以你应该检查它并处理不是的情况。

关于android - 有没有办法在 Activity 之间传递函数引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45617564/

相关文章:

android - Retrofit 2 请求总是失败 - Kotlin

kotlin - 我无法理解 Kotlin 中的 generateSequence 函数

android - ACCESS_FINE_LOCATION 未授予 AndroidManifest 权限

java - 在 RxJava 中订阅 Observable 时出现问题

android - CoroutineScope 和 withContext 之间的 Kotlin 区别

javascript - 加载页面后在 webview 的字段中以编程方式输入文本

android - JNCryptor - RNCryptor 图像文件加密/解密

安卓计费 : How to handle pending purchases

android - 无法解析 firebase

android - 屏幕方向更改后继续 Activity - Android