Android:在某些情况下仍受到 'Can not perform this action after onSaveInstanceState' 的困扰

标签 android illegalstateexception onsaveinstancestate

我们使用 Dialogfragment 来显示一些对话框,有时这些对话框会导致“IllegalStateException:无法在 onSaveInstanceState 之后执行此操作”。

过去这种情况经常发生,我可以通过编写 DialogHelper 来显示/关闭对话框来减少 IllegalStateException 的数量。

不幸的是,有时我仍然会收到有关此问题的崩溃报告,并再次查看它,但我无法找出如何最终正确解决此问题。

目前报告的崩溃发生在单击按钮时,我们想要显示一个对话框(例如 DateSliderDialog),但我无法重现崩溃:/。

mFromDateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!isFinishing()) {
                String title= getString(R.string.dateSliderTitle);
                DateSliderDialog dateSliderDialog= DateSliderDialog.newInstance(title, getMinFromDate().getTimeInMillis(), getFromDateForDialog().getTimeInMillis(), DateUtils.getEndOfUniverseDate().getTime());
                DialogHelper.showDialog(getSupportFragmentManager(), dateSliderDialog, InquireReservationActivity.this, String.valueOf(FROM_DATE_DIALOG_ID));
            }
        }
    });

调用 DialogHelper.showDialog(...) 方法

    public static void showDialog(FragmentManager fragmentManager, DialogFragment dialogFragment, Context context, String dialogTag) {
    if (fragmentManager != null && dialogFragment != null && (dialogFragment.getDialog() == null || !dialogFragment.getDialog().isShowing())) {
        if (context instanceof MyActivity) {
            if(!((MyActivity)context).isFinishing() && ((MyActivity)context).mIsActivityRunning) {
                dialogFragment.show(fragmentManager, dialogTag);
            }
        } else if (context instanceof MyListActivity) {
            if(!((MyListActivity)context).isFinishing() && ((MyListActivity)context).mIsActivityRunning) {
                dialogFragment.show(fragmentManager, dialogTag);
            }
        } else if (context instanceof MyPreferenceActivity) {
            if(!((MyPreferenceActivity)context).isFinishing() && ((MyPreferenceActivity)context).mIsActivityRunning) {
                dialogFragment.show(fragmentManager, dialogTag);
            }
        } else {
            if(!((Activity)context).isFinishing()) {
                dialogFragment.show(fragmentManager, dialogTag);
            }
        }
    }
}

如您所见,我已经在检查:

  • Activity 结束了吗?
  • Activity 是否正在运行(通过 Activity 上的标志)?

有谁知道为什么这种情况仍然发生以及如何解决它?

感谢您的建议和解答

最佳答案

每当您关闭对话框时,请使用

  dialogFragment.dismissAllowingStateLoss();

关于Android:在某些情况下仍受到 'Can not perform this action after onSaveInstanceState' 的困扰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39120690/

相关文章:

android - 如何在 fragment 中保存和恢复recyclerview的位置

java - 方向改变后保持 CountDownTimer 运行

java - 在 Android 布局 XML 中将 TextView 放置在 EditText 元素之前会导致 EditText 不显示

android - 如何使用python为android制作语音命令程序?

android - Galaxy Nexus 上动态壁纸上位图的 OutOfMemory 错误

android - IllegalStateException: fragment <ThisFragment> 当前不在 FragmentManager 中

android - 如何在服务中使用 Universal-Image-Loader?

在 android 中添加 google place API 时出现 java.lang.IllegalStateException

android - 在 Android 上保持 TensorFlow 模型加密