嗨其他Android开发者,
我尝试连续两个DialogFragments,所以当第一个被取消时会弹出第二个。
这是我到目前为止所做的:
在我的活动中,我调用以下方法:
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
答案 0 :(得分:2)
您正在对话框片段中使用活动的旧实例。我猜您在mContext
方法中将当前活动作为newInstance
传递。在更改配置或键盘等配置后,此上下文对象将变为无效,并且不再附加到任何窗口。
您可以使用getActivity()
FragmentDialog
方法获取其所在的当前活动。