我找到了解决这个问题的方法:
而不是扩展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
这迫使丢弃所有保存的片段并在方向更改时重新创建它们。