有没有办法在活动之间传递函数引用?

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

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() } } 

感谢大家的帮助!

如果tryAgainFunction是可Serializable ,那么你可以使用bundle.putSerializable("try_again_function", tryAgainFunction); 把它放到bundle bundle.putSerializable("try_again_function", tryAgainFunction);

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

不像其他人说的那样,没有办法将一个函数文字传递给Bundle

但是由于enum实现了Serializable ,所以你可以传递可以存放一些方法的枚举variables。 尝试下面的代码;

 enum class SampleEnum(val f: () -> Unit) { Sample0({ Log.d("enum Test", "sample 0") }), Sample1({ Log.d("enum Test", "sample 1") }), } 

在你的活动(或片段);

 bundle.putSerializable("sample_enum",SampleEnum.Sample0) 

在你的活动(或片段);

  // invoke your fuction (bundle.getSerializable("sample_enum") as SampleEnum).f() 

但是,如果无法将函数文字放入Bundle ,则可以通过类似Fragment的函数将函数传递给Fragment

 fun setTryAgainFunction(tryAgainFunction: () -> Unit) { }