在某些场景下,旋转屏幕、内存不足,或app内切换语言主动调用reCreate()方法,造成Activity被destroy ,系统会recreate 重新创建该Activity ,会重走onCreate()方法, 如果Activity的onCreate中存在add Fragment操作,则会再次add一次该Fragment,造成该Activity中FragmentManager添加了多个相同的Fragment,造成也面显示覆盖的问题。
解决方案:
private int currentIndex = 0;
private Fragment currentFragment = new Fragment();
private Fragment fagment1 = new MyFragment1();
private Fragment fagment2 = new MyFragment2();
在onCreate()方法中判断savedInstanceState状态,reCreate()后savedInstanceState不为空,
通过getSupportFragmentManager().findFragmentByTag(),获取之前add过的fragment,
避免造成重复add fragment,savedInstanceState == null时调用的是原来onCreate()中的方法。
if (savedInstanceState != null) {
fagment1 = getSupportFragmentManager().findFragmentByTag("tag1");
fagment2 = getSupportFragmentManager().findFragmentByTag("tag2");
//记录当前显示的时哪个fragment
int tabId = savedInstanceState.getInt("currentIndex");
if (tabId == 0) {
switchFragment(fagment1).commit();
} else {
switchFragment(fagment2).commit();
}
} else {
switchFragment(investmentFragment).commit();
}
private FragmentTransaction switchFragment(Fragment targetFragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (!targetFragment.isAdded()) {
if (currentFragment != null) {
transaction.hide(currentFragment);
}
String tag = targetFragment.getClass().getName();
transaction.add(R.id.fragment, targetFragment, tag);
} else {
transaction.hide(currentFragment).show(targetFragment);
}
currentFragment = targetFragment;
return transaction;
}
public void onTabClick(View view) {
switch (view.getId()) {
case R.id.tab1:
currentIndex = 0;
switchFragment(fagment1).commit();
break;
case R.id.tab2:
currentIndex = 1;
switchFragment(fagment2).commit();
break;
default:
break;
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("currentIndex", currentIndex);
}