从Fragment调用时,DialogFragment对话框以错误的顺序出现

时间:2011-05-07 09:28:21

标签: android android-fragments android-3.0-honeycomb

我正在使用兼容性库将代码移植到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)检查visibity时,请执行以下操作:

FragmentManager fm = fragment.getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fragment.D1tag).ft.commit();          

现在3)做了一些工作,除非它没有,并且抛出了一个illegalStateException,因为在某些情况下找不到片段(例如提前解除对话框)。

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

提前致谢。彼得。

1 个答案:

答案 0 :(得分: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();
        }
    }
});