38

私はモンキークラッシュを持っています

java.lang.IllegalStateException: Failure saving state: FragmentB has target not in fragment manager: FragmentA
at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1561)
at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:475)
at com.acme.ParentActivity.onSaveInstanceState(Unknown Source)

基本的に、FragmentA は FragmentB をロードし、setTargetFragmentFragmentB のターゲット フラグメントを設定するために呼び出されます。

その後、FragmentBgetTargetFragmentはそのonCreateメソッドを呼び出すだけで、必要に応じてターゲットにハングアップします。

onSaveInstanceState現在、ターゲットフラグメントをnullに設定したりsaveFragmentInstanceState、などの呼び出しを行ったりするという点で、ターゲットフラグメントを使用した呼び出しでは何もしていませんputFragment。問題は、私はそれで何かをすべきかということです?

前もって感謝します、

ピーター。

** 編集 1 ** サポート ライブラリの古いバージョンを使用していますが、これは最新バージョンで修正される可能性があり、さらにテストし、その場合はさらにアップデートを提供する予定です。ただし、現在行っていないターゲットフラグメントで何かを行う必要があるかどうかを知りたい.

** 編集 1 ** サポート ライブラリのバージョン 8 で修正されました (他は試していません)。

4

8 に答える 8

36

この問題を解決するには、実際には次の 2 つのことを行う必要があります。

1. FragmentA から FragmentB を起動するときは、getFragmentManager() ではなく getChildFragmentManager() を使用してください。

getChildFragmentManager() を呼び出すと、ホスティング フラグメントの FragmentManager が返されますが、getFragmentManager() は、ホスティング アクティビティの FragmentManager が返されます。Fragment を別の Fragment 内にネストしているため、getChildFragmentManager() を使用することが重要です。そのため、親 Fragment は、ネストされた Fragment とのトランザクションの処理を担当する必要があります。getFragmentManager() を使用すると、現在発生している問題に遭遇します。

2. setTargetFragment() と getTargetFragment() は使用しないでください。getChildFragmentManager() を使用すると機能しません。

代わりに、getParentFragment() を使用してください。Androidには現在、適切に呼び出しても何らかのバグがあると思います

fragmentB.setTargetFragment(fragmentA, 0);

次に FragmentB を表示します。構成の変更後、FragmentB から getTargetFragment() を呼び出すと、 FragmentA ではなくそれ自体が返されます。

于 2016-06-13T16:00:24.017 に答える
14

回避策は次のとおりです。

これを問題を引き起こすフラグメントに入れます:

@Override
public void onSaveInstanceState(final Bundle outState) {
    setTargetFragment(null, -1);
            ...

必要に応じて、実際のターゲットフラグメントに設定することを忘れないでください。

于 2014-05-01T13:27:25.267 に答える
5

最近、この問題に遭遇しました。android.support.v4.app を拡張するカスタム アダプターを実装しました。FragmentStatePagerAdapter . android.support.v4.app を使用。FragmentManagerでは、ページャーにいくつかのフラグメントをセットアップし、ページャーの外側にいくつかの他のフラグメントをセットアップしました。フラグメントは単一のアクティビティで管理されます。非ページング フラグメントのターゲットを ( setTargetFragmentを使用して) ページング アダプターに含まれる場合と含まれない場合があるフラグメントに設定していた場合がいくつかあります。FragmentStatePagerAdapterは特定の数のフラグメントのみを保持するため、ターゲットとして設定されたフラグメントとどのFragmentStatePagerAdapterそれらのターゲットを持つフラグメントがまだ存在する場合、潜在的に矛盾した状態になります。これにより、アプリがフォーカスを失ったとき (画面がオフになったとき、またはアプリがバックグラウンドになったとき)、つまりonSaveInstanceStateが呼び出されたときに例外がスローされました。

この例外を防ぐために、onSaveInstanceStateで、現在フラグメント マネージャーにあるフラグメントを確認しました。不一致があった場合 (つまり、「ターゲット」フラグメントが欠落している場合)、そのターゲット セットを持つフラグメントを削除しました。私たちの場合、ターゲットを設定するフラグメントが 3 つしかなかったため、何を探すべきかが正確にわかりました。

このケースを処理する他の方法はないと思いますが、誰かに役立つフィードバックがあれば、それは大歓迎です.

于 2014-01-30T00:16:29.663 に答える