子ViewPagerを含むViewPagerを持つ親のFragmentアクティビティがあります。子ViewPagerには、各ページのフラグメントが含まれています。私はこれらの子ページフラグメントとトップの親フラグメントアクティビティとの間で、コールバックインターフェースを使用して通信します。親フラグメント活動にアクティビティの再起動後に 'getSupportFragmentManager()'が呼び出されたときに 'IllegalStateException:アクティビティが破棄されました'
public interface Callbacks {
public void onItemSelected(Link link);
}
私はonItemSelected
イベントをリッスン例えば
@Override
public void onItemSelected(Link link) {
Bundle argumentsFront = new Bundle();
argumentsFront.putParcelable(FragmentComments.ARG_ITEM_ID, link);
fragmentComments = new FragmentComments();
fragmentComments.setArguments(argumentsFront);
getSupportFragmentManager().beginTransaction().replace(R.id.post_container, fragmentComments).commitAllowingStateLoss();
}
これは、アプリが初めて起動されたときに正常に機能します。
方向を変更するようにデバイスをオンにすると、アクティビティが再開します。 setRetainInstance(true);
を使用すると、すべてのフラグメントが再初期化されます(子ViewPagerのフラグメントではsetRetainInstance(true)はサポートされていないため呼び出さない)。私は子供ViewPagerの断片でリスト項目をクリックした場合しかし、私はこの例外を取得:これはなぜ起こるか
FATAL EXCEPTION: main
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
誰でも知っていますか?私は同様の問題があった
おかげ
残念ながら、これは動作しません。私の 'onAttach'メソッドは既にあなたが提供したもののように見えます。オリエンテーションの変更時に、私の 'onAttach'メソッドが再度呼び出されず、結果として私のコールバックが更新されていません。 親フラグメントに 'setRetainInstance(true)'があります。これは、この子フラグメントがデタッチされないようにしますか? – Milo
'setRetainInstance(true)'が設定されていても 'onAttach'はまだ呼び出されているはずですので、ここで何か間違っているかもしれません。あなたのコールバックを設定して呼び出すことについてもっとコードを投稿できますか?また、 'setRetainInstance(true)'を使って、この質問に対する答えをチェックしてください。この状況では良い習慣ではありません。保存して状態を復元する必要があります。http://stackoverflow.com/questions/11182180/understanding-fragments- setretaininstanceboolean –
解決策が見つかりました。 (FragmentActivity - >フラグメント1 - >フラグメント2(ViewPager付き) - > ViewPagerチャイルドフラグメント) コールバックをフラグメント1(onAttachとonDetachが呼び出されている)に移動しなければならなかったため、 。私はViewPagerの子フラグメントの 'onItemSelected'メソッドから親フラグメント(フラグメント1)のコールバックへ静的呼び出しを行いました。 これは少しハックしたようですが、うまく機能します。フラグメント1に 'setRetainInstance(true)'を使用するので、子フラグメントも状態を保持します。 – Milo