缘起
首先,笔者的主Activity中包含了多个Fragment,通过show、hide来切换展示。当笔者切换到其他的APP,操作一段时间后,返回到当前APP,有很大几率会出现Fragment重叠现象。
缘由
首先,在Activity的生命周期中,当Activity不在前台展示时,如果此时其他的APP需要使用内存,系统会杀掉该APP的进程,当用户重新进入该APP时,系统会重新创建Activity。
Activity不在前台展示时会保存Fragment的状态,当系统重新创建Activity时会恢复之前保存的Fragment的状态。
缘解
方案一:在Activity的onCreate方法中判断savedInstanceState是否为空,不为空则使用系统保存的Fragment。
public class MainActivity extends AppCompatActivity {
Fragment fragment;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
fragment = getSupportFragmentManager().findFragmentByTag("fragment");
} else {
fragment = new Fragment();
getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, fragment, "fragment").commit();
}
}
}
方案二:在Activity的onCreate方法中,调用super方法时直接传null,不使用保存的状态。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(null);
}
参考资料:
Android fragment 重叠问题——通过hide,show方式导致的解决方法
解决Activity重新刷新后Fragment的show、hide失效问题
深入理解Activity的生命周期