从onContextItemSelected显示的DialogFragment在onPause/onResume上不存在

Tom*_*ney 8 android android-lifecycle android-fragments android-dialog

我有一个DialogDragment,我可以用以下两种方式之一:

1)通过点击其OnItemClickListener中的ListView项

2)通过激活ListView的上下文菜单并选择菜单项

做#1在所有生命周期事件下都能正常工作,但是如果我通过#2调用它并暂停活动(通过回家)并通过任务切换器恢复它,则不再显示对话框.片段在那里,我可以旋转设备并显示对话框.

我进行了实验,如果我把DialogFragment的显示放到Handler中,延迟时间至少为1/2秒,那就可以了.

以下代码段失败 - 它显示对话框,但暂停/恢复隐藏它:

public boolean onContextItemSelected(android.view.MenuItem item) {
    boolean consumed = false;

    switch (item.getItemId()) {
    case R.id.menu_item:
        showMyDialogFragment();
        consumed = true;
        break;
    }

    return consumed;
}
Run Code Online (Sandbox Code Playgroud)

所以下面的代码段可行.暂停/恢复再次正确显示对话框:

public boolean onContextItemSelected(android.view.MenuItem item) {
    boolean consumed = false;

    switch (item.getItemId()) {
    case R.id.menu_item:
        new Handler().postDelayed(new Runnable() {
            public void run() {
                showMyDialogFragment();
            }
        }, 300);

        consumed = true;
        break;
    }

    return consumed;
}
Run Code Online (Sandbox Code Playgroud)

用0ms或250ms延迟替换300ms秒延迟会导致它再次被破坏.这可重复100%的时间.

这显然是一个可怕的黑客,通过可能取决于设备速度的常数变得更糟.

有谁知道为什么会这样做和/或提供更好的解决方案?我在这个问题上花了好几个小时,这是我能想到的最好的.

Roy*_*ley 2

我建议在所有暂停时销毁对话框,并根据状态在 onResume 中重新创建,无论对话框是如何调用的。否则,如果应用程序在暂停时被操作系统终止,则存在内存泄漏的风险。

要明确回答您的问题,请不要依赖操作系统来维护您的应用程序状态。