2

Dialogfragment を使用していくつかのダイアログを表示すると、「IllegalStateException: Can not perform this action after onSaveInstanceState」が発生することがあります。

過去にこれは頻繁に発生し、ダイアログを表示/非表示にする DialogHelper を作成することで、この IllegalStateException の数を減らすことができました。

残念ながら、これに関するクラッシュ レポートをまだ受け取り、もう一度調べてみたところ、最終的にこの問題を正しく修正する方法を見つけることができませんでした。

現時点で報告されているクラッシュは、ボタンの onClick で発生しており、ダイアログ (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);
            }
        }
    }
}

ご覧のとおり、次のことを既に確認しています。

  • アクティビティは終了していますか?
  • アクティビティは (アクティビティのフラグを通じて) 実行されていますか?

なぜこれがまだ起こっているのか、そしてそれを修正する方法を知っている人はいますか?

提案と回答をありがとう

4

1 に答える 1