10

子ViewPagerを含むViewPagerを持つ親Fragment Activityがあります。子 ViewPager には、各ページのフラグメントが含まれています。コールバック インターフェイスを使用して、これらの子ページ フラグメントと最上位の親フラグメント アクティビティの間で通信します。

public interface Callbacks {
    public void onItemSelected(Link link);
}

onItemSelected親 Fragment Activity で、イベントをリッスンします。

@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 のページ Fragments で setRetainInstance(true) を呼び出しません)。ただし、子 ViewPager の Fragment でリスト項目をクリックすると、次の例外が発生します。

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)

なぜこれが起こるのか誰か知っていますか?

ありがとう

4

5 に答える 5

11

Activityデバイスを回転させると、Android はデバイスとそのデバイスViewPagerを保存、破棄、再作成しますFragments。はあなたのViewPagerを使用するため、それらを保存して再利用し (新しいものは作成しません)、元の (現在は破棄された) 元の への古い参照を保持し、それを取得します。FragmentManagerActivityFragmentsActivityIllegalStateException

あなたの子供Fragmentsで、次のようなことを試してください:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    Log.v(TAG, "onAttach");

    // Check if parent activity implements our callback interface
    if (activity != null) {
        try {
            mParentCallback = (Callbacks) activity;
        }
        catch (ClassCastException e) {
        }
    }
}

次に、選択が発生すると:

if(mParentCallback != null) {
    mParentCallback.onItemSelected(selectedLink);
}

ライフサイクルonAttachの一部として呼び出されるため、ローテーション時にコールバック参照を更新します。FragmentFragments

于 2013-02-12T04:02:37.307 に答える
0

同様の問題がありました。フラグメントが保持され、destoryed アクティビティへの参照を保持しているためだと思います。私の解決策は、Fragment myfragment = null などのアクティビティ内のフラグメントへの参照を保持することでした。次に、MyFragment で次のコードを使用します。

    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((TestActivity)activity).contentFragment = this;
}
于 2013-02-11T22:14:18.643 に答える
0

OnPostResume コールバックでトランザクションをコミットすると、問題が解決しました。次のブログ投稿に感謝します http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

@Override
protected void onPostResume() {
    super.onPostResume();
    // Commit your transactions here.
}
于 2014-08-20T14:04:55.833 に答える