行コードactivity再構築fragmentオーバーラップ問題の解決
2037 ワード
fragmentを使用したことがある人は、activityのonCreateメソッドでfragmentを作成して追加したことがあるのではないでしょうか.activityは再構築onCreateメソッドを破棄すると実行され、破棄前にfragemntに関する情報が保存されるとactivityは回復し、作成と復元が同時に存在するとactivityには2つのfragmentが存在します.
私の要求は:1、fragmentの重複問題の出現を根絶することです;2,activity破棄時に再構築時にリカバリするために十分な情報を保存する
私は多くの方法を参考にしましたが、私の要求に達していないと思います.今、本人の解決策を提供して、あなたたちが同じ需要があるかどうかを見てみましょう.
まず私のactivityはAppCompatActivityに継承され、AppCompatActivityはFragmentActivityに継承されています.FragmentActivityを見てみましょう.
赤いコードが見えたでしょう.
Parcelable p = mFragments.saveAllState();
if (p != null) { outState.putParcelable(FRAGMENTS_TAG, p); }
この場所でfragemntの情報を保存した場合、保存した情報を空にするだけでいいです.すなわち、onSaveInstanceStateメソッドを複写するには、次のようにします.
これはfragmentの情報を保存しないだけで、他の情報は保存され、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が重なる問題を解決します.