【问题标题】:Dismiss DialogFragment after screen rotation屏幕旋转后关闭 DialogFragment
【发布时间】: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/…
  • 好的,不再崩溃,但它会在旋转后(或同时)消失。所以错误消失了,但这也不是我想要的。

标签: android dialog fragment


【解决方案1】:

我也有同样的问题。我找到了唯一的解决方案。使用 Otto 和事件。例如: 我的对话片段

@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());

这不是优雅的解决方案,但可以正常工作。

【讨论】:

    【解决方案2】:

    也许问题是当方向改变时,onCreate 方法被再次调用并重新创建视图,尝试将其添加到您的清单中

    android:configChanges="orientation"
    

    如果您使用更多的 configChanges,只需添加一个“|”

    android:configChanges="keyboardHidden|orientation"
    

    【讨论】:

    • 我已经知道这个“解决方案”,但我认为这不是解决方案,只是一种解决方法。用户必须为无能的程序员付费——我认为开发不应该工作......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多