【发布时间】:2015-01-28 23:11:38
【问题描述】:
我在屏幕旋转后关闭 DialogFragment 时遇到问题。
DialogFragement 是这样创建的:
CalendarDialog calendar = new CalendarDialog();
calendar.setOnCalendarEventClickListener(this);
dialog = calendar;
calendar.show(getFragmentManager(), "calendar");
监听器看起来像这样:
@Override
public void onCalenderEventClick(CalendarEvent event) {
// TODO crashing after rotating while in dialog
((DialogFragment) getFragmentManager().findFragmentByTag("calendar")).dismiss();
// dialog.dismiss();
showDay(event.getBegin());
}
当只是调用侦听器时,一切正常。 但是当屏幕旋转时,dismiss 会收到 NullPointerException(以上两种解决方案)。
我也尝试过保存和恢复对话ID,但没有成功:
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putLong("dialog", dialog.getId());
super.onSaveInstanceState(outState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState,
PersistableBundle persistentState) {
if (savedInstanceState == null)
return;
dialog = (DialogFragment) getFragmentManager().findFragmentById(savedInstanceState.getInt("dialog"));
// super.onRestoreInstanceState(savedInstanceState, persistentState);
}
显然,活动在旋转时重新创建,所以一切都消失了......
【问题讨论】:
-
对于对话框,您可以在
CalendarDialog中使用setRetainInstance(true)。 developer.android.com/reference/android/app/… -
好的,不再崩溃,但它会在旋转后(或同时)消失。所以错误消失了,但这也不是我想要的。