// Create a FragmentLifecycleCallbacks (inner) class:
inner class ChildFragmentCallbacks : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentPaused(fm: FragmentManager, f: Fragment) {
super.onFragmentPaused(fm, f)
if(f is YourDialogFragment){
// YourDialogFragment is closed, you can update parent fragment here
updateParentFragment()
}
}
}
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
class YourParentFragment : Fragment() {
// ...
// Create a FragmentLifecycleCallbacks (inner) class:
inner class ChildFragmentCallbacks : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentPaused(fm: FragmentManager, f: Fragment) {
super.onFragmentPaused(fm, f)
if(f is YourDialogFragment){
// YourDialogFragment is closed, you can update parent fragment here
updateParentFragment()
}
}
}
private fun updateParentFragment(){
// Do it
}
// Register it on onCreate():
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
childFragmentManager.registerFragmentLifecycleCallbacks(ChildFragmentCallbacks(), false)
}
// ...
}
7条答案
按热度按时间bvjxkvbb1#
你可以添加一个监听器并覆盖片段对话框的onDismiss:
字符串
然后,在父节点上设置监听器:
型
7xllpg7q2#
重写DialogFragment的onDismiss(),或者在构建底层对话框时,使用setOnDimissListener()设置侦听器。
2w3rbyxf3#
我试过@Gazer回答,它对我不起作用,我使用不同的片段类
字符串
但我让它工作了
1.创建接口类
型
1.在父片段中实现接口类
型
1.然后在DialogFragment中添加侦听器
型
erhoui1w4#
处理此问题的一种方法是将您的DialogFragment嵌入到Activity中,并将Activity显示为Dialog,以下链接中有一个技巧说明了如何操作:
http://developer.android.com/guide/topics/ui/dialogs.html
您可以使用它来更新底层的Fragment,因为当Dialog(它是一个Activity)完成时,将在底层的Fragment上调用onResume()。在onResume()方法中添加代码来更新片段的状态,这就是它的全部内容。
pkmbmrz75#
我刚刚在我的项目中解决了这个问题。我有一个带有ListFragment的Activity。在该列表片段中,当单击特定项时,我将显示一个DatePickerFragment(一个显示DatePickerDialog的自定义DialogFragment)。选择日期后,我希望刷新ListFragment。
为了实现这一点,在承载ListFragment的Activity中(事实上,它也承载DatePickerFragment),我实现了一个方法,该方法只是用一个新示例替换ListFragment,如下所示:
字符串
我从DatePickerFragment调用这个方法,从onDateSet():
型
这对我来说很有用。
7d7tgy0s6#
这里最受欢迎的答案都有问题。
在
DialogFragment
中不能将侦听器作为示例变量保存,因为它们将无法在重新创建后继续存在,并且您会想知道为什么您的回调“神奇地”停止工作。你可以在这里阅读更多关于这一点:
https://medium.com/@lukeneedham/listeners-in-dialogfragments-be636bd7f480
本文提供了几个真实的的解决方案,其中我最喜欢的是使用带有自定义接口的
targetFragment
。对于拦截dismiss,它看起来像:字符串
vom3gejh7#
正如@Luke提到的,最重要的答案有问题。您还可以使用
FragmentLifecycleCallbacks
实现您想要的功能,而无需任何自定义接口或侦听器。1-创建内部FragmentLifecycleCallbacks()类:
字符串
2-在onCreate()上注册:
型
总代码:
型