1、原因:当activity在后台并且内存不足时,系统会把activity给回收掉,但也会保存部分(不是全部)信息用于下次页面恢复。这样会导致下次进入页面后布局或数据错乱,并且点击底部Tab无法切换fragment。
2、解决方法:
(1)方法一:注释掉super.onSaveInstanceState(outState),这样被回收时就不会保存部分数据了,下次进来可以相当于首次进来一样,全部重新创建布局和价值数据,但这种方法略显粗糙,并且如果当前activity的初始化需要依赖前一个页面数据这样也不行。
@Override
protected void onSaveInstanceState(Bundle outState) {
//super.onSaveInstanceState(outState);
}
(2)方法二:FragmentPagerAdapter里会有一个FragmentManager,当activity被缓存后FragmentManager里面的fragment部分信息也会被缓存,当下次进入activity后删除FragmentManager缓存的fragment,用新创建的fragment替换,这样就可以重新切换了。
/**
* 重新初始化所有fragments
*/
private void reinitFragments() {
isNeedReinitFragments = true;
fragments.clear();
initFragments();
homeViewPagerAdapter.notifyDataSetChanged();
}
class HomeViewPagerAdapter extends FragmentPagerAdapter {
... ... //省略其他方法
@Override
public int getItemPosition(Object object) {
if (isNeedReinitFragments) {
return POSITION_NONE;
}
return super.getItemPosition(object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
String tag = fragment.getTag();
//用于activity内存不足时,重新初始化所有fragment
if (isNeedReinitFragments) {
FragmentTransaction transaction = fm.beginTransaction();
transaction.remove(fragment);
fragment = fragments.get(position);
transaction.add(container.getId(),fragment,tag);
transaction.attach(fragment);
transaction.commitAllowingStateLoss();
}
return fragment;
}
}