显示DialogFragment时未暂停的调用Fragment

10

在我的应用程序的一个部分中,我展示给用户一个ListView。当用户按下列表中的一个项目时,会显示一个DialogFragment

@Override
public void onClick() {
    android.support.v4.app.FragmentTransaction ft = getFragment().getFragmentManager().beginTransaction();
    ft.addToBackStack(null);
    SingleSettingDialogFragment dialog = SingleSettingDialogFragment.newInstance(...);
    dialog.show(ft, "Single");
}

DialogFragment 的结构如下:

@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
    super.onCreateDialog(savedInstanceSate);
    AlertDialog dialog =  new AlertDialog.Builder(...)
        ...
        .create();
    ...
    return dialog;
}

当用户退出DialogFragment时,我期望调用该Fragment的onResume()方法,但实际上并没有被调用。
那么为什么DialogFragment有这样的特殊性质?为什么当Dialog显示时,调用它的Fragment没有被暂停?如何实现呢?
我在文档中没有找到关于此行为的参考,如果有参考资料那就更好了。
3个回答

6
这可能对你有所帮助:链接 实际上,FragmentDialog并不是一个独立的activity,而是与调用它的fragment在同一个activity中。
这意味着当DialogFragment显示时,fragment并不会被暂停。
引用我给你的来源,当一个activity在前台并具有焦点,但包含此fragment的activity仍然可见(前台activity部分透明或未覆盖整个屏幕)时,fragment会被暂停。
希望有所帮助。

这并不是我所问的。 我知道DialogFragment本身并不是一个活动,我也不希望我的活动接收到onPause事件。 我期望在显示DialogFragment时请求DialogFragment的片段被暂停,就像任何其他片段一样。 - Joakim
2
该文本的意思是当活动暂停时,片段才会暂停。两个片段,由同一个活动托管,例如在您的情况下,可以同时存在并都处于活动状态。这就是为什么您的片段没有暂停的原因。 - gbaccetta

1

处理这个问题的一种方法是在Activity中嵌入您的DialogFragment,并将该Activity显示为对话框。以下链接中有一个提示来解释如何实现:

http://developer.android.com/guide/topics/ui/dialogs.html

您可以使用此功能更新基础Fragment,因为当Dialog(即Activity)完成时,将调用基础片段的onResume()方法。在onResume()方法中添加代码以更新片段的状态即可。

另一种方法是重写OnDismiss()方法并在其中使用回调侦听器,该侦听器将回调父片段。

这些是我方面的建议,希望能得到任何线索。


1
当您打开一个DialogFragmentBottomSheetDialogFragment时,调用片段的onPauseonResume方法不会被调用。
为了处理这个问题,您可以使用FragmentLifecycleCallbacks1- 创建一个FragmentLifecycleCallbacks(内部)类:
// Create a FragmentLifecycleCallbacks (inner) class:
    inner class ChildFragmentCallbacks : FragmentManager.FragmentLifecycleCallbacks() {
        override fun onFragmentResumed(fm: FragmentManager, f: Fragment) {
            super.onFragmentResumed(fm, f)
            // dialogFragments/bottomsheetfragments oppend
        }

        override fun onFragmentPaused(fm: FragmentManager, f: Fragment) {
            super.onFragmentPaused(fm, f)
            // dialogFragments/bottomsheetfragments closed
        }
    }

2- 在onCreate()上注册它:

childFragmentManager.registerFragmentLifecycleCallbacks(ChildFragmentCallbacks(), false)

总代码:
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 onFragmentResumed(fm: FragmentManager, f: Fragment) {
            super.onFragmentResumed(fm, f)
            // dialogFragments/bottomsheetfragments oppend
        }

        override fun onFragmentPaused(fm: FragmentManager, f: Fragment) {
            super.onFragmentPaused(fm, f)
            // dialogFragments/bottomsheetfragments closed
        }
    }

    // Register it on onCreate():
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        childFragmentManager.registerFragmentLifecycleCallbacks(ChildFragmentCallbacks(), false)
    }

    // ...

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接