android - 从 onContextItemSelected 显示的 DialogFragment 在暂停/恢复时不存在

标签 android android-fragments android-dialog android-lifecycle

我有一个 DialogDragment,我可以用两种方式之一显示它:

1) 通过点击 ListView 项目的 OnItemClickListener

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

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

我进行了实验,如果我将 DialogFragment 的显示放入处理程序中至少延迟 1/2 秒,它就可以工作。

以下代码 fragment 失败了——它显示了对话框,但随后暂停/恢复隐藏了它:

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

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

    return consumed;
}

所以下面的代码 fragment 有效。暂停/恢复再次正确显示对话框:

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请添加您认为有助于他们诊断问题的任何其他信息。

关于变通方法,如果 300 毫秒有效,那么我们就会遇到那些可爱的“计时问题”之一,而且我完全不知道您将如何解决它,除非不使用菜单来显示它.例如,对于您的示例应用程序,只需切换到 SHOW_AS_ACTION_ALWAYS(因此让它成为操作栏上的一个项目而不是溢出菜单中的项目)就足以让 DialogFragment 举止得体。希望您有办法调整您的 UI 来弥补这个错误,或者也许有人会想出另一种解决方法并将其张贴在这里或在这个问题上。

关于android - 从 onContextItemSelected 显示的 DialogFragment 在暂停/恢复时不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14016043/

相关文章:

c# - 将 Lambda 函数传递给 Xamarin.Android 绑定(bind)库中的 Kotlin 的 C# 生成代码

android - 如何修复在 Nexus 设备中出现移动的导航栏?

android - 带有列表选择项的警告框保持为空

java - 具有自定义内容 View 的 AlertDialog 看起来与 AlertDialog 完全不同

java - Android GoogleApiClient 应用程序在 connect() 时崩溃

java - 为什么AndEngine的CollisionHandler在一次碰撞中会产生多个事件?

android - 如何隐藏工具栏中的菜单项(查看寻呼机,嵌套 fragment )

java - 我只是无法让 fragment 工作

android - 如何对对话执行触觉反馈?

android - 在透明形状上投下阴影?