Fragment 重叠问题的产生
因为某些原因(例如旋转屏幕)而导致 Activity 发生重建时,Fragment 也会发生重建。重建的 Fragment 如果没有保存状态,那么它的 mHidden 默认为 false,即 hide 失效,这时所有添加到容器的 Fragment 都会显示出来,就产生了重叠现象。
解决问题
要解决 Fragment 的重叠问题,关键是要在 Activity 发生重建时保存 Fragment 的状态,这就可以利用 Activity 的 onSaveInstanceState 方法:
private static final String KEY_FG_A = "fg_a";
private static final String KEY_FG_B = "fg_b";
private static final String KEY_FG_C = "fg_c";
private FragmentManager mFragmentManager = getSupportFragmentManager();
// 假设有以下三个 Fragment
private Fragment mFragmentA;
private Fragment mFragmentB;
private Fragment mFragmentC;
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 保存已创建的 Fragment
if (mFragmentA != null) {
mFragmentManager.putFragment(outState, KEY_FG_A, mFragmentA);
}
if (mFragmentB != null) {
mFragmentManager.putFragment(outState, KEY_FG_B, mFragmentB);
}
if (mFragmentC != null) {
mFragmentManager.putFragment(outState, KEY_FG_C, mFragmentC);
}
}
然后在 onCreate 方法中判断 savedInstanceState 是否为空,不为空说明 Activity 发生了重建,需要恢复 Fragment:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
// 取出保存的 Fragment
mFragmentA = mFragmentManager.getFragment(savedInstanceState, KEY_FG_A);
mFragmentB = mFragmentManager.getFragment(savedInstanceState, KEY_FG_B);
mFragmentC = mFragmentManager.getFragment(savedInstanceState, KEY_FG_C);
} else {
// 第一次 onCreate 时的操作,例如显示第一个 Fragment
// ...
}
}
这时恢复的 Fragment 就保存了原来的状态,屏幕只会显示一个 Fragment,不会出现重叠的现象。