Android - 如何解除onPause中的所有对话框

And*_*dyB 38 android dialog

我有一个活动可以在运行时显示不同的对话框.我使用onCreateDialog(int id)来创建每个对话框,我使用showDialog(int id)和dismissDialog(int id)方法分别显示和关闭每个对话框.

当调用onPause()时,我不知道正在显示哪个对话框(如果有).我想确保在调用onPause时,所有对话框都会被忽略.是否有推荐的方法来解雇所有对话框?我是否必须为每个对话框调用dismissDialog()?

Dom*_*icz 25

如果您正在使用DialogFragment,并且想要解雇所有可以使用的内容:

/**
 * Dismiss all DialogFragments added to given FragmentManager and child fragments
 */
public static void dismissAllDialogs(FragmentManager manager) {
    List<Fragment> fragments = manager.getFragments();

    if (fragments == null)
        return;

    for (Fragment fragment : fragments) {
        if (fragment instanceof DialogFragment) {
            DialogFragment dialogFragment = (DialogFragment) fragment;
            dialogFragment.dismissAllowingStateLoss();
        }

        FragmentManager childFragmentManager = fragment.getChildFragmentManager();
        if (childFragmentManager != null)
            dismissAllDialogs(childFragmentManager);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这似乎是DialogFragment的最干净的解决方案。您是否在生产应用程序中使用它? (2认同)

mhr*_*dek 14

取决于我们谈论的对话框数量.简短的回答是肯定的,你必须解雇每个对话框.

除了在活动级别声明一些对话框之外,可能还有一些优雅的方法.您可以在声明后将所有对话框存储在HashMap中,然后遍历列表并关闭每个对话框onPause.

由于您不知道哪些是开放的,您需要通过并测试或跟踪状态.

但是,如果您在屏幕上真的有这么多对话框,那么您的UI/UX设计可能会遇到一些问题,因为Android应该为您提供一个模型,这样可以轻松实现它而不会出现设计不佳的情况.

  • 此外,为避免因关闭对话框而导致错误,您可以在每次关闭对话框时使用try-catch.这比检查打开的对话框要容易得多. (6认同)

qui*_*tor 8

随着android最近强调使用DialogFragment容器,你不需要在每个容器上调用dismiss

由于对话框将具有Fragment容器,因此您可以简单地使用它们的生命周期.考虑一下这个DialogFragment:

public class FragDialog extends DialogFragment{

    public ProgressDialog _dialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            //this.dismiss();     <-- The dialogs may be dismissed here
        }
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {

        _dialog = new ProgressDialog(getActivity());
        return _dialog;
    }

    @Override
    public void onPause() {
        super.onPause();
        // <--------- You may overload onPause
    }
}
Run Code Online (Sandbox Code Playgroud)

您将使用fragmentmanager在您的活动中显示哪个通常会像这样调用它:

FragmentManager fm = getSupportFragmentManager();
FragDialog fragDialog = new FragDialog();
fragDialog.show(fm, "my_tag");
Run Code Online (Sandbox Code Playgroud)

请注意,您实际上可能会更改DialogFragment在onPause中执行的操作.当您的活动调用onPause时,也会调用此onPause.

使用this.dismiss()在onPause()中关闭对话框将无法完成工作,因为一旦活动恢复,它也将恢复对话框.(我认为这是因为savestate存储在onPause之前).

但是,如果检测到代码中显示的savedInstanceState(简历),则可以安全地关闭onCreate中的对话框.