我有一个 DialogDragment 可以显示以下两种方式之一:
1)通过从其 OnItemClickListener 中点击 ListView 项目
2) 通过激活 ListView 的上下文菜单并选择一个菜单项
执行 #1 在所有生命周期事件下都可以正常工作,但是如果我通过 #2 调用它并暂停活动(通过返回主页)并通过任务切换器恢复它,则不再显示对话框。片段就在那里,我可以旋转设备并显示对话框。
我进行了实验,如果我将 DialogFragment 的显示放入一个延迟至少 1/2 秒的 Handler 中,它就可以工作。
以下片段失败 - 它显示对话框,但随后暂停/恢复隐藏它:
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;
}
用 0 毫秒或 250 毫秒的延迟替换 300 毫秒的秒延迟会导致它再次被破坏。这可重复 100% 的时间。
这显然是一个可怕的黑客攻击,可能取决于设备速度的常数使情况变得更糟。
有人知道为什么会这样和/或提供更好的解决方案吗?我在这个问题上花了几个小时,这是我能想到的最好的。