从onContextItemSelected显示的DialogFragment不会在onPause / onResume中生存

我有一个DialogDragment,我可以显示以下两种方法之一:

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

2)通过激活ListView的上下文菜单并select一个菜单项

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

我进行了实验,如果将DialogFragment的显示延迟至less1/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%的时间。

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

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

Solutions Collecting From Web of "从onContextItemSelected显示的DialogFragment不会在onPause / onResume中生存"

我可以在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正常工作。 希望你有一个调整你的用户界面的方法来弥补这个bug,也许有人会做出另一个解决方法,并在这里或这个问题上发布。

我会build议销毁所有暂停对话框,并根据状态在onResume中重新创build,而不pipe对话框如何被调用。 否则,如果应用程序在暂停时被操作系统终止,则会导致内存泄漏。

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