有没有办法在活动之间传递函数引用?
有没有在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) { }