行コードactivity再構築fragmentオーバーラップ問題の解決


fragmentを使用したことがある人は、activityのonCreateメソッドでfragmentを作成して追加したことがあるのではないでしょうか.activityは再構築onCreateメソッドを破棄すると実行され、破棄前にfragemntに関する情報が保存されるとactivityは回復し、作成と復元が同時に存在するとactivityには2つのfragmentが存在します.
私の要求は:1、fragmentの重複問題の出現を根絶することです;2,activity破棄時に再構築時にリカバリするために十分な情報を保存する
 
私は多くの方法を参考にしましたが、私の要求に達していないと思います.今、本人の解決策を提供して、あなたたちが同じ需要があるかどうかを見てみましょう.
 
まず私のactivityはAppCompatActivityに継承され、AppCompatActivityはFragmentActivityに継承されています.FragmentActivityを見てみましょう.
onSaveInstanceState :
/**
 * Save all appropriate fragment state.
 */
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Parcelable p = mFragments.saveAllState();
    if (p != null) {
        outState.putParcelable(FRAGMENTS_TAG, p);
    }
    if (mPendingFragmentActivityResults.size() > 0) {
        outState.putInt(NEXT_CANDIDATE_REQUEST_INDEX_TAG, mNextCandidateRequestIndex);

        int[] requestCodes = new int[mPendingFragmentActivityResults.size()];
        String[] fragmentWhos = new String[mPendingFragmentActivityResults.size()];
        for (int i = 0; i < mPendingFragmentActivityResults.size(); i++) {
            requestCodes[i] = mPendingFragmentActivityResults.keyAt(i);
            fragmentWhos[i] = mPendingFragmentActivityResults.valueAt(i);
        }
        outState.putIntArray(ALLOCATED_REQUEST_INDICIES_TAG, requestCodes);
        outState.putStringArray(REQUEST_FRAGMENT_WHO_TAG, fragmentWhos);
    }
}

赤いコードが見えたでしょう.
Parcelable p = mFragments.saveAllState();
if (p != null) { outState.putParcelable(FRAGMENTS_TAG, p); }
この場所でfragemntの情報を保存した場合、保存した情報を空にするだけでいいです.すなわち、onSaveInstanceStateメソッドを複写するには、次のようにします.
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelable("android:support:fragments", null);
}

これはfragmentの情報を保存しないだけで、他の情報は保存され、fragmentが重なる問題を解決します.