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

我有一个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; } 

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

 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; } 

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

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

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

我可以在Android 4.2(ARM模拟器和Galaxy Nexus)上重现这一点。 我无法在x86 4.1仿真器,Nexus S(4.1)和Motorola RAZR i(4.0)上重现您的发现。 我也可以通过修改我自己的一本书样本来重现这个问题。 我使用您的示例提交了一个问题: http : //code.google.com/p/android/issues/detail?id = 41901请添加您认为可以帮助他们诊断问题的任何其他信息。

关于一个变通方法,如果300ms工作,那么我们有一个可爱的“时间问题”,我没有最模糊的想法你如何解决它,没有使用菜单来显示它。 例如,使用您的示例应用程序,只需切换到SHOW_AS_ACTION_ALWAYS (因此将其作为操作栏上的项而不是溢出菜单)就足以使DialogFragment正常运行。 希望你能有一种方法来调整你的用户界面以弥补这个错误,或者也许有人会做出另一种解决方法并在此处或在问题上发布。

我建议在所有暂停时销毁对话框,并根据状态重新创建onResume,而不管对话框是如何调用的。 如果应用程序在暂停时被操作系统杀死,则可能会造成内存泄漏。

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