Kotlin开发中Dialog弹窗关闭后如何更新父Fragment内的TextView内容
Android Kotlin Dialog关闭后修改父Fragment控件内容的实现方案
问题描述
进行Android Kotlin开发时需要实现以下需求:点击Dialog内的按钮关闭Dialog后,修改父Fragment中txtTotalDist TextView的内容。此前的多种实现尝试均失败,相关代码和错误提示如下:
rootView.btnDialogOK.setOnClickListener { val frag: ParentFragment() frag.txtTotalDist.text="A" // 错误:Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference (activity as ParentFragment).txtTotalDist.post { txtTotalDist.text = "A" } // 错误:cannot be cast to ParentFragment txtTotalDist.post { txtTotalDist.text = "A" } // 错误:Attempt to invoke virtual method 'boolean android.widget.TextView.post(java.lang.Runnable)' on a null object reference txtTotalDist.text = "A" // 错误:Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference dismiss() }
另外尝试过重写父Fragment的onAttach、onResume、onStart、onViewStateRestored等生命周期方法,Dialog关闭时这些方法均不会被触发,无法通过生命周期回调实现需求。
错误原因说明
- 直接新建
ParentFragment实例:该实例未经过Fragment生命周期挂载,View尚未初始化,因此控件为空 - 将Activity强转为Fragment:Activity和Fragment是完全不同的组件,类型不匹配无法强转
- 直接在Dialog中调用
txtTotalDist:Dialog的布局中不存在该控件,找不到实例因此为空 - Dialog关闭不会触发父Fragment的上述生命周期,因此无法通过生命周期回调执行更新逻辑
正确实现步骤
1. 添加依赖
在模块级build.gradle中添加Fragment KTX依赖:
implementation 'androidx.fragment:fragment-ktx:1.4.0'
2. 父Fragment中注册结果监听
在父Fragment的onCreate方法中注册Fragment结果监听器,收到Dialog返回的结果后执行对应更新逻辑:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setFragmentResultListener("requestKey") { key, bundle -> val result = bundle.getString("action") if (result == "del") { // 此处替换为你的更新逻辑 txtTotalDist.text = "A" // 也可直接调用原有封装好的刷新方法 // refreshStatusBar() } } }
3. Dialog中发送结果通知
在Dialog的按钮点击事件中,先发送结果通知给父Fragment,再关闭Dialog:
rootView.btnDialogRemove.setOnClickListener { setFragmentResult("requestKey", bundleOf("action" to "del")) dismiss() }
内容的提问来源于stack exchange,提问作者Artyum
相关产品推荐
相关产品推荐

