IllegalStateException:DialogFragmentを使用している場合、onSaveInstanceStateの後にこのアクションを実行できません



Illegalstateexception



今日質問がありました。ログを検索した後、次のエラーメッセージが表示されました。

AndroidRuntime: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:4) AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1) AndroidRuntime: at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:12) AndroidRuntime: at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:1) AndroidRuntime: at android.support.v4.app.DialogFragment.show(DialogFragment.java:5)

この問題の理由は、show()メソッドを使用する場合、つまりフラグメントを表示するときに次のコードを実行する場合に、DialogFragmentに問題があるためです。




例外の理由は、アクティビティのonSaveInstanceState()の後にcommit()メソッドが呼び出され、アクティビティが破棄される前にonSaveInstanceStateメソッドが呼び出されてアクティビティデータが保存されるため、エラーが発生するためです。状態を保存した後でフラグメントを追加すると、エラーが発生します。
解決策は、commit()メソッドをcommitAllowingStateLoss()に置き換えることです。効果は同じです。次に、DialogFragmentのソースコードを確認すると、commitAllowingStateLoss()を使用してshowメソッドが見つかりません。どうすればよいですか?やれ?
考えてみてください。親クラスのshowメソッドをオーバーライドできると思いますか? commitAllowingStateLoss()を使用して、commit()メソッドを置き換えます。しかし、このメソッドはプライベート変数を使用していることがわかりました。これは恥ずかしいことです。何をすべきか、私はすぐにリフレクションテクノロジーを使用して親クラスのプライベート変数を変更し、確実に書き換えられるようにすることを考えました。showメソッドの後、他の状態は合法で正常です。
コードは次のとおりです。



/** * Override the show() method of the parent class * Avoid java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState */ @Override public void show(FragmentManager manager, String tag) { try { Class cls = this.getClass().getSuperclass() if (cls == null) return Field mDismissed = cls.getDeclaredField('mDismissed') Field mShownByMe = cls.getDeclaredField('mShownByMe') mDismissed.setAccessible(true) mShownByMe.setAccessible(true) mDismissed.setBoolean(this, false) mShownByMe.setBoolean(this, true) } catch (Exception e) { Log.e('DialogFragment', 'show', e.fillInStackTrace()) } FragmentTransaction ft = manager.beginTransaction() ft.add(this, tag) ft.commitAllowingStateLoss() }

テスト後、これまでのところ他の問題は発見されていません。誰もが不合理な場所を指摘することを歓迎します

さらに、インターネット上の誰かが、ホームボタンをクリックした後、onPause()の前にonSaveInstanceState()メソッドが実行され、私のテストの結果、最初にonPause()メソッドが実行され、次にonSaveInstanceState()が実行されると言いました。メソッドが実行されます。
————————————————
この記事はあなた自身の参照のために転載されています、元のリンク:https://blog.csdn.net/baidu_28027209/article/details/79740209