web-dev-qa-db-ja.com

DialogFragmentのcommitAllowingStateLoss

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変数にアクセスしません。これらの変数にアクセスして、親のようにそれらを変更するにはどうすればよいですか。

32
Arash GM

IllegalStateExceptionDialogFragmentをスローしないようにした方が良いかもしれません。

_ YourDialogFragment dialogFragment = new YourDialogFragment();
 fragmentManager.beginTransaction().add(dialogFragment, YourDialogFragment.TAG_FRAGMENT).commitAllowingStateLoss();
_

DialogFragmentshow()を使用する代わりに。

38
Arash GM

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;
}
5
cn123h

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
}
_

mDismissedmShownByMe変数を使用しているので、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から入手可能

2
vuhung3990