【发布时间】:2012-12-10 13:30:27
【问题描述】:
我有一个 DialogDragment,我可以显示以下两种方式之一:
1) 通过从其 OnItemClickListener 中点击 ListView 项目
2) 通过激活 ListView 的上下文菜单并选择一个菜单项
执行 #1 在所有生命周期事件下都可以正常工作,但如果我通过 #2 调用它并暂停活动(通过返回 Home)并通过任务切换器恢复它,则不再显示对话框。片段就在那里,我可以旋转设备并显示对话框。
我进行了实验,如果我将 DialogFragment 的显示放入一个延迟至少 1/2 秒的 Handler 中,它可以工作。
以下 sn-p 失败 -- 它显示对话框,但随后暂停/恢复将其隐藏:
public boolean onContextItemSelected(android.view.MenuItem item) {
boolean consumed = false;
switch (item.getItemId()) {
case R.id.menu_item:
showMyDialogFragment();
consumed = true;
break;
}
return consumed;
}
所以下面的 sn-p 工作。暂停/继续正确显示对话框:
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;
}
用 0 毫秒或 250 毫秒的延迟代替 300 毫秒的延迟会导致它再次被破坏。这种可重复性 100% 的时间。
这显然是一个可怕的 hack,可能取决于设备速度的常数使情况变得更糟。
有人知道为什么会这样和/或提供更好的解决方案吗?我在这个问题上花了几个小时,这是我能想到的最好的。
【问题讨论】:
-
我认为这可能与菜单隐藏动画有关。即使是旧的、速度较慢的 Nexus One,300 毫秒的延迟也有效。
-
如果有机会,请发布一个完整的示例项目来演示这种现象,因为我想看看它。如果它真的是一个平台错误,我们无论如何都需要那个项目来帮助解决问题。此外,这是使用原生 API 级别 11 片段,还是 Android 支持包的反向移植?如果是后者,您确定您使用的是最新版本的 Android Support JAR?
-
这里是演示问题的示例项目:github.com/androidmoney/Menu-DialogFragment-Test 它发生在本机和支持片段包上。要显示问题,请显示对话框按钮或菜单项。然后暂停(转到主页)并继续(使用应用切换器重新进入应用)。
-
我遇到了一个非常相似(相同?)的问题:stackoverflow.com/questions/18730141/…
标签: android android-fragments android-dialog android-lifecycle