屏幕旋转后关闭 DialogFragment
Dismiss DialogFragment after screen rotation
我在屏幕旋转后关闭 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());
}
只要调用监听器,一切正常。
但是当屏幕旋转时,解雇会得到 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);
}
显然 activity 在旋转时重新创建,所以一切都消失了...
可能问题是当方向改变时,onCreate
方法被再次调用并重新创建视图,尝试将其添加到您的清单中
android:configChanges="orientation"
如果您使用更多 configChanges 只需添加一个“|”
android:configChanges="keyboardHidden|orientation"
我也遇到了同样的问题。我找到了唯一的解决方案。使用 Otto 和事件。例如:
MyDialogFragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BusProvider.getInstance().register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
BusProvider.getInstance().unregister(this);
}
@Subscribe
public void OnDismissLoadingDialogEvent(DismissLoadingDialogEvent event) {
dismissAllowingStateLoss(); // Allowed here without consequences
}
在activity中:
loadingDialogFragment.show(getSupportFragmentManager(), LoadingDialogFragment.class.getName());
并解雇:
BusProvider.getInstance().post(new DismissLoadingDialogEvent());
这不是一个优雅的解决方案,但它工作正常。
我在屏幕旋转后关闭 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());
}
只要调用监听器,一切正常。 但是当屏幕旋转时,解雇会得到 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);
}
显然 activity 在旋转时重新创建,所以一切都消失了...
可能问题是当方向改变时,onCreate
方法被再次调用并重新创建视图,尝试将其添加到您的清单中
android:configChanges="orientation"
如果您使用更多 configChanges 只需添加一个“|”
android:configChanges="keyboardHidden|orientation"
我也遇到了同样的问题。我找到了唯一的解决方案。使用 Otto 和事件。例如: MyDialogFragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BusProvider.getInstance().register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
BusProvider.getInstance().unregister(this);
}
@Subscribe
public void OnDismissLoadingDialogEvent(DismissLoadingDialogEvent event) {
dismissAllowingStateLoss(); // Allowed here without consequences
}
在activity中:
loadingDialogFragment.show(getSupportFragmentManager(), LoadingDialogFragment.class.getName());
并解雇:
BusProvider.getInstance().post(new DismissLoadingDialogEvent());
这不是一个优雅的解决方案,但它工作正常。