私はこの問題の解決策を見つけました:
クラスを拡張する代わりにFragmentStatePagerAdapter
、ソースコードを変更しました(必要な場合は、https ://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/で見つけることができます)。 android / support / v4 / app / FragmentStatePagerAdapter.java)
私がしたことは、restoreStateMethod
このように変更することでした:
public void restoreState(Parcelable state, ClassLoader loader) {
Log.d(TAG, "restoreState");
//We don't want to restore the fragments if the orientation changes!
if(isLastOrientationPortrait != isPortrait){
if(state != null){
Bundle bundle = (Bundle) state;
bundle.setClassLoader(loader);
Iterable<String> keys = bundle.keySet();
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
for (String key : keys) {
if (key.startsWith("f")) {
Fragment f = mFragmentManager.getFragment(bundle,
key);
mCurTransaction.remove(f);
}
}
}
isLastOrientationPortrait = isPortrait;
}else{
if (state != null) {
Bundle bundle = (Bundle)state;
bundle.setClassLoader(loader);
Parcelable[] fss = bundle.getParcelableArray("states");
mSavedState.clear();
mFragments.clear();
if (fss != null) {
for (int i=0; i<fss.length; i++) {
mSavedState.add((Fragment.SavedState)fss[i]);
}
}
Iterable<String> keys = bundle.keySet();
for (String key: keys) {
if (key.startsWith("f")) {
int index = Integer.parseInt(key.substring(1));
Fragment f = mFragmentManager.getFragment(bundle, key);
if (f != null) {
while (mFragments.size() <= index) {
mFragments.add(null);
}
f.setMenuVisibility(false);
mFragments.set(index, f);
} else {
Log.w(TAG, "Bad fragment at key " + key);
}
}
}
}
}
}
私が基本的に追加したのは、これが最初のifステートメントです。
if(isLastOrientationPortrait != isPortrait){
if(state != null){
Bundle bundle = (Bundle) state;
bundle.setClassLoader(loader);
Iterable<String> keys = bundle.keySet();
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
for (String key : keys) {
if (key.startsWith("f")) {
Fragment f = mFragmentManager.getFragment(bundle,
key);
mCurTransaction.remove(f);
}
}
}
isLastOrientationPortrait = isPortrait;
}
ここisPortrait
で、は現在の方向のブール値であり、isLastOrientationPortrait
はonSaveInstanceState
この強制により、保存されたすべてのフラグメントが破棄され、方向が変更されたときにそれらが再作成されます。