Android 从片段调用时,DialogFramentDialog以错误的顺序出现

Android 从片段调用时,DialogFramentDialog以错误的顺序出现,android,android-fragments,android-3.0-honeycomb,Android,Android Fragments,Android 3.0 Honeycomb,我正在使用兼容性库将代码移植到蜂巢。我的预移植代码如下所示,我有活动A、B和对话框D1和D2。B有一个从别处接收消息的消息处理程序 A调用B,B在消息1中通过调用showDialog显示D1。在消息2中,如果用户尚未解除D1,则使用以下代码解除D1,然后显示D2: if (D1.isShowing()) { D1.dismiss(); } 这个很好用 对于我的移植代码,A加载一个片段,FB包含消息处理程序,D1和D2现在派生自DialogFragment。我已修改代码,以便使用以下命令

我正在使用兼容性库将代码移植到蜂巢。我的预移植代码如下所示,我有活动A、B和对话框D1和D2。B有一个从别处接收消息的消息处理程序

A调用B,B在消息1中通过调用showDialog显示D1。在消息2中,如果用户尚未解除D1,则使用以下代码解除D1,然后显示D2:

if (D1.isShowing()) {
    D1.dismiss();
}
这个很好用

对于我的移植代码,A加载一个片段,FB包含消息处理程序,D1和D2现在派生自DialogFragment。我已修改代码,以便使用以下命令显示对话框:

dlg.show(fragmentManager, tag);
上述检查通过以下方式执行:

if (D1.isVisible()) {
    D1.dismiss();
}
然而,这是行不通的。首先显示D2,然后显示D1。我假设这是因为在进行上述检查时,as D1不可见,并且D2被添加到堆栈的顶部,这就是为什么第一个D2的onCreateView在D1之前被调用的原因

现在,我尝试了各种各样的方法,但都无济于事:

1通过获取事务管理器并查看D1是否在堆栈上来检查可见性。 2使用以下命令显示对话框:

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(0, dlg);
ft.commit();            
或者使用“替换/删除”而不是“添加”

3检查访问权限时,请执行以下操作:

FragmentManager fm = fragment.getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fragment.D1tag).ft.commit();          
现在3做了一些工作,但当它不做的时候,会抛出一个illegalStateException,因为在某些情况下找不到该片段,例如提前关闭对话框

关于如何解决这个问题,或者我是否真的以完全错误的方式思考这个问题,或者该活动应该控制对话框的生命周期,有什么想法吗?应该提到的是,对于我的pre-Honeycomb应用程序,活动B现在是一个加载FB的包装器活动,所以我真的不想在a和B中复制任何生命周期管理代码


提前谢谢。Peter。

好的,在经历了许多死胡同之后,我终于通过在我的消息处理程序中实现以下功能来获得我想要的功能,以便将消息发布到片段的消息处理程序中,并使用“show…”来显示所有对话框:

new Handler().post(new Runnable() {
    public void run() {
        FragmentManager fm = fragment.getFragmentManager();
        DialogFragment fd = (DialogFragment) fm.findFragmentByTag(d1Tag);
        if (fd != null) {
            fm.beginTransaction().remove(fd).commit();
        }
    }
});