如何称呼这类非点击触摸、用于跨Fragment监听状态变化的Listener函数?
自定义接口监听器(跨Fragment事件回调)说明
你所描述的这类监听器本质是基于观察者模式实现的自定义接口回调,和Android内置的setOnClickListener、setOnTouchListener等触摸监听器底层逻辑完全一致,区别在于前者监听的是系统预设的触摸交互事件,而你需要的是监听自定义业务事件(比如数据变更、视图状态变化),可以完全通过自定义接口实现,具体实现方案如下:
核心逻辑
通过自定义接口定义需要监听的事件回调方法,让产生事件的数据源Fragment持有接口引用,需要响应事件的目标组件(Fragment/Activity)实现该接口并完成注册,事件触发时数据源Fragment调用接口方法即可完成跨组件的事件通知和数据传递。
具体实现步骤
- 第一步:自定义监听接口,根据业务需求声明对应的回调方法
interface CustomBusinessListener { // 监听数据变更事件回调 fun onDataReceived(data: Any) // 监听视图展开状态变化回调 fun onViewExpandStateChanged(isExpanded: Boolean) }
- 第二步:在数据源Fragment(事件产生方)中添加监听器引用和注册方法,事件触发时调用回调
class DataSourceFragment : Fragment() { // 存储监听器实例 private var customListener: CustomBusinessListener? = null // 对外提供监听器注册方法 fun setCustomBusinessListener(listener: CustomBusinessListener) { this.customListener = listener } // 示例:本Fragment内部数据更新时触发回调 private fun innerDataUpdated(newData: Any) { customListener?.onDataReceived(newData) } // 示例:本Fragment内部视图展开状态变化时触发回调 private fun innerViewStateChanged(expanded: Boolean) { customListener?.onViewExpandStateChanged(expanded) } override fun onDestroyView() { super.onDestroyView() // 清空引用避免内存泄漏 customListener = null } }
- 第三步:在需要接收事件的目标Fragment中实现接口,注册监听器并处理回调
class TargetFragment : Fragment(), CustomBusinessListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 获取数据源Fragment实例后注册监听器 val dataSourceFrag = parentFragmentManager.findFragmentByTag("data_source_frag_tag") as? DataSourceFragment dataSourceFrag?.setCustomBusinessListener(this) } // 实现数据变更回调处理逻辑 override fun onDataReceived(data: Any) { // 此处编写业务逻辑,比如更新当前Fragment的UI } // 实现视图状态变化回调处理逻辑 override fun onViewExpandStateChanged(isExpanded: Boolean) { // 此处编写业务逻辑,比如调整当前Fragment的布局样式 } }
注意事项
- 若需要同时通知多个接收方,可将单个监听器引用改为
MutableList<CustomBusinessListener>存储多个实例,事件触发时遍历调用所有实例的回调方法即可 - 回调方法默认运行在事件触发的线程,若需要在回调中更新UI,请确保切换到Android主线程执行
- 组件销毁时及时清空监听器引用,避免出现内存泄漏问题
内容的提问来源于stack exchange,提问作者Rodrigo Barboza
相关产品推荐
相关产品推荐

