在Kotlin for Android中触发一个接口

当使用Kotlin for Android时,有一个特定的接口实现:从一个片段触发一个接口。 考虑一下Fragment必须将UI操作传递给父Activity的常见场景。 在Java中,我们将定义接口,创建它的“侦听器”实例,并在接口父节点中实现/覆盖动作。 这是创建一个监听器实例,对我来说不是那么简单。 一些谷歌搜索后,我find了一个实现的例子,但我不明白为什么它的作品。 有一个更好的方法吗? 为什么必须按照以下的方式来实施?

class ImplementingFragment : Fragment(){ private lateinit var listener: FragmentEvent private lateinit var vFab: FloatingActionButton //Here is the key piece of code which triggers the interface which is befuddling to me override fun onAttach(context: Context?) { super.onAttach(context) if(context is FragmentEvent) { listener = context } } //Notice the onClickListener using our interface listener member variable override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val v: View? = inflater.inflate(R.layout.fragment_layout, container, false) vFab = v?.findViewById(R.id.fh_fab) vFab.setOnClickListener{listener.SomethingHappened()} return v } } interface FragmentEvent{ fun SomethingHappened() } 

在这个代码中, lateinit var listener: FragmentEvent应该被初始化,不能为null 。 所以onAttach应该看起来像

 override fun onAttach(context: Context?) { super.onAttach(context) if (context is FragmentEvent) { listener = context } else { throw RuntimeException(context!!.toString() + " must implement FragmentEvent") } } 

在这种情况下,如果你忘记在Activity实现FragmentEvent ,你会得到一个exception,否则回调就可以使用了。