Fragment如何感知其打开的Dialog Fragment已关闭并处理后续逻辑
Android 父Fragment监听DialogFragment关闭事件的实现方案
这里提供两种常用的无耦合实现方式,优先推荐第一种官方原生方案:
方案1:使用Fragment Result API(AndroidX Fragment 1.3.0+ 支持)
不需要定义接口,通过系统提供的结果传递机制实现监听,步骤如下:
- 第一步:在父Fragment(即你放置触发打开Dialog按钮的Bottom Navigation关联Fragment)的
onViewCreated生命周期中注册结果监听器
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 注册监听,requestKey可自定义,需要和Dialog中发送时的key保持一致 setFragmentResultListener("dialog_close_key") { _, _ -> // 收到Dialog关闭的通知,直接执行目标逻辑 yourTriggerButton.visibility = View.INVISIBLE } // 原有打开Dialog的逻辑保持不变 yourTriggerButton.setOnClickListener { val dialog = YourCustomDialogFragment() dialog.show(childFragmentManager, "custom_dialog_tag") } }
- 第二步:在自定义DialogFragment中,关闭时发送通知即可
class YourCustomDialogFragment : DialogFragment() { override fun onDismiss(dialog: DialogInterface) { super.onDismiss(dialog) // 发送关闭通知,不需要传参的话bundle可以为空 setFragmentResult("dialog_close_key", bundleOf()) } }
方案2:接口回调(兼容低版本Fragment依赖)
如果你的项目Fragment依赖版本低于1.3.0,可以用传统接口回调实现:
- 第一步:在DialogFragment内部定义回调接口,并在关闭时触发
class YourCustomDialogFragment : DialogFragment() { // 定义关闭回调接口 interface OnDialogCloseListener { fun onClose() } private var closeListener: OnDialogCloseListener? = null override fun onAttach(context: Context) { super.onAttach(context) // 从父Fragment获取接口实现实例 closeListener = parentFragment as? OnDialogCloseListener } override fun onDismiss(dialog: DialogInterface) { super.onDismiss(dialog) closeListener?.onClose() } }
- 第二步:父Fragment实现该接口,处理逻辑
class YourParentFragment : Fragment(), YourCustomDialogFragment.OnDialogCloseListener { // 实现接口方法,处理按钮隐藏逻辑 override fun onClose() { yourTriggerButton.visibility = View.INVISIBLE } }
内容的提问来源于stack exchange,提问作者ybybyb
相关产品推荐
相关产品推荐

