2

嗨,Android 开发人员,

我尝试连续有两个 DialogFragment,所以当第一个被取消时,会弹出第二个。

这是我到目前为止所拥有的:

在我的活动中,我调用以下方法:

void showFirstDialog() {
        // Pass the context to do a callback
        DialogFragment newFragment = ChangeDialogFragment.newInstance(mContext);
        newFragment.show(getSupportFragmentManager(), "myFirstDialogTag");
    }

在我的 DialogFragment 中,我有以下代码来检测它将被取消:

@Override
    public void onCancel(DialogInterface dialog) {
            // Use Context to do a callback and inform the Activity that
            // Fragment is cancelled
        ((Activity) mContext).firstDialogCanceled();
        super.onCancel(dialog);
    }

回到我的活动中,我通过启动第二个对话框对此事件做出反应:

void firstDialogCanceled {
        DialogFragment newFragment = InformationDialogFragment.newInstance();
        newFragment.show(getSupportFragmentManager(), "mySecondDialogTag");
    }

只要我在第一个对话框上没有方向更改,这就会完美地工作。当我有一个时,我收到以下错误:

java.lang.IllegalStateException:onSaveInstanceState 后无法执行此操作

此异常在“newFragment.show(getSupportFragmentManager(), “mySecondDialogTag”); 行引发。

我认为如何解决这个问题是手动关闭第一个对话框。我试过以下:

DialogFragment firstFragment = (DialogFragment) getSupportManager().findFragmentByTag("myFirstDialogTag");
firstFragment.dismiss();

再次没有方向改变一切工作正常。当我在屏幕上显示第一个对话框时更改方向时,我在“firstFragment.dismiss()”行上得到一个 NullPointerException。

为什么会这样?为什么 FragmentManager 在方向更改后会忘记我的 DialogFragment 以及为什么我不能只显示第二个。Androidreferences 说:

您应该使用 show(FragmentManager, String) 或 show(FragmentTransaction, String) 将 DialogFragment 的实例添加到您的 UI,因为它们会跟踪 DialogFragment 在关闭对话框时应如何删除自身。

我确实使用 show,但它仍然无法正常工作。

任何提示都非常感谢!

干杯 Ali3n

4

1 回答 1

2

您正在对话片段中使用活动的旧实例。我猜你正在传递当前的活动作为mContext方法newInstance。在诸如方向或键盘之类的配置更改后,此上下文对象将变为无效并且不再附加到任何窗口。

您可以使用getActivity()of 方法FragmentDialog获取它所在的当前活动。

于 2011-12-24T20:06:59.990 回答