屏幕旋转后关闭DialogFragment

时间:2015-01-28 23:11:39

标签: android dialog fragment

我在旋转屏幕后解除DialogFragment时遇到问题。

DialogFragement的创建方式如下:

CalendarDialog calendar = new CalendarDialog();
calendar.setOnCalendarEventClickListener(this);
dialog = calendar;
calendar.show(getFragmentManager(), "calendar");

并且Listener看起来像这样:

@Override
public void onCalenderEventClick(CalendarEvent event) {
    // TODO crashing after rotating while in dialog
    ((DialogFragment) getFragmentManager().findFragmentByTag("calendar")).dismiss();
    // dialog.dismiss();
    showDay(event.getBegin());
}

当只是调用Listener时,一切正常。 但是当屏幕旋转时,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);
}

显然,活动会在旋转时重新创建,所以一切都消失了......

2 个答案:

答案 0 :(得分:0)

我有同样的问题。我找到了唯一的解决方案。使用奥托和事件。例如: 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
}

活动中:

loadingDialogFragment.show(getSupportFragmentManager(),       LoadingDialogFragment.class.getName());

并解雇:

BusProvider.getInstance().post(new DismissLoadingDialogEvent());

这不是优雅的解决方案,但它运作正常。

答案 1 :(得分:-4)

问题可能是当方向发生变化时,再次调用onCreate方法并重新创建视图,尝试将其添加到清单

android:configChanges="orientation"

如果您使用更多的configChanges只需添加" |"

android:configChanges="keyboardHidden|orientation"