IllegalStateException
を表示するときにDialogFragment
があります。
Java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
私はなぜそれが起こっているのか知っていますが、DialogFragment show
functionをオーバーライドしてダイアログを表示するときにcommitAllowingStateLossを使用したいと思います。
public void show(FragmentManager manager, String tag) {
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit(); //replace it by commitAllowingStateLoss
}
しかし、mDismissed
およびmShownByMe
変数にアクセスしません。これらの変数にアクセスして、親のようにそれらを変更するにはどうすればよいですか。
IllegalStateException
でDialogFragment
をスローしないようにした方が良いかもしれません。
_ YourDialogFragment dialogFragment = new YourDialogFragment();
fragmentManager.beginTransaction().add(dialogFragment, YourDialogFragment.TAG_FRAGMENT).commitAllowingStateLoss();
_
DialogFragment
でshow()
を使用する代わりに。
CommitAllowingStateLossに関するソリューションは、DialogFragmentに保存する状態がない場合に機能します。そうでない場合、関数名が示すように状態は失われます。しかし、ほとんどの場合、保存する状態があると思います。これがDialogFragmentの主な利点です:Android再作成して、状態を自動的に維持します。
より良い解決策は、再作成プロセスが完了したかどうかを確認することです。そうでない場合は、アクティビティまたはFragmentActivityのいずれかである呼び出し元に戻ります。それをマークし、後でonPostResume()またはonResumeFragments()で再度show関数を呼び出す必要があります。これにより、すべてのフラグメントが確実に再作成されます。
以下は、DialogFragmentのサブクラスからのオーバーライドされたshow()です。
public boolean show(FragmentManager fragmentManager) {
if (fragmentManager.isStateSaved()) return false;
show(fragmentManager, tagName);
return true;
}
Originダイアログフラグメント
_public void show(FragmentManager manager, String tag) {
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit(); //replace it by commitAllowingStateLoss
}
_
mDismissed
、mShownByMe
変数を使用しているので、DialogFragmentのshow(FragmentManager, String)
メソッドをオーバーライドすることをお勧めします。
_override fun show(manager: FragmentManager?, tag: String?) {
if (manager?.isDestroyed == false && !manager.isStateSaved) {
super.show(manager, tag)
}
}
_
isStateSaved
appcompat> = 26.0.0またはandroidxから入手可能