问题描述:
在使用fragment时,如果程序崩溃导致页面重启,会出现页面重叠现象
问题gif图:
问题原因:
1、首页Fragment在切换时,使用了show()和hide()方法。当出现崩溃时,首页MainActivity被销毁,此时,onSaveInstanceState() 方法会将相关数据进行保存。
2、重启App进入MainActivity中,onCreate(Bundle savedInstanceState) 方法,通过savedInstanceState 将之前保存的数据进行了恢复。
3、这种情况下,崩溃前show的Fragment 通过addFragment方式重新加载,从而导致fragment的show()和hide()方法失效,从而出现重叠效果。
解决方法:
在addFragment的时候添加一个tag
在onCreate()方法中对savedInstanceState参数进行判断,如果不为空,那么就用tag获取fragment,显示出来即可
具体代码
显示Fragment逻辑
public void showFragment(Fragment fragment) {
String tag;
if (fragment instanceof MainPagerFragment) {
tag = "main";
} else {
tag = "study";
}
//开启事务 创建事务对象
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
//如果之前没有添加过
if (!fragment.isAdded()) {
fragmentTransaction.add(R.id.home_content,fragment,tag);
if (currentFragment != null) {
//隐藏fragment
fragmentTransaction.hide(currentFragment);
}
} else {
if (currentFragment != null) {
fragmentTransaction.hide(currentFragment);
}
fragmentTransaction.show(fragment);
}
//全局变量,记录当前显示的fragment
currentFragment = fragment;
fragmentTransaction.commit();
}
onCreate
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFragmentManager = getSupportFragmentManager();
if (savedInstanceState != null) {
mainPagerFragment = mFragmentManager.findFragmentByTag("main");
studyPagerFragment = mFragmentManager.findFragmentByTag("study");
showFragment(mainPagerFragment);
}
initView();
}
initView
setContentView(R.layout.activity_home);
if (mainPagerFragment == null) {
mainPagerFragment = new MainPagerFragment();
}
if (studyPagerFragment == null) {
studyPagerFragment = new StudyPagerFragment();
}
showFragment(mainPagerFragment);