我正在使用兼容性库将代码移植到 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 中复制任何生命周期管理代码。
提前致谢。彼得。