0

我正在使用兼容性库将代码移植到 Honeycomb。我的预移植代码的工作方式如下,我有活动 A、B 和对话框 D1 和 D2。B 有一个消息处理程序从其他地方接收消息。

A 调用 B,它在消息 (1) 上通过调用 showDialog 显示 D1。在消息 (2) 上,如果用户尚未关闭 D1,则使用以下代码将其关闭,然后显示 D2:

if (D1.isShowing()) {
    D1.dismiss();
}

这工作正常。

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

dlg.show(fragmentManager, tag);

上面的检查是通过以下方式执行的:

if (D1.isVisible()) {
    D1.dismiss();
}

但是,这不起作用。发生的情况是首先显示 D2,然后在关闭时显示 D1。我假设这是因为在进行上述检查时 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) 做了一些工作,除非它没有,并且因为在某些情况下找不到片段(例如提前解除对话框)而引发了非法状态异常。

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

提前致谢。彼得。

4

1 回答 1

0

好的,经过一些死胡同后,我终于设法通过在我的消息处理程序中实现以下内容来获得我想要的功能,以便将消息发布到片段的消息处理程序中,并使用'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();
        }
    }
});
于 2011-05-09T09:09:58.190 回答