Android -- Fragment切换数据丢失

2017-07-20  本文已影响500人  墨白1629

加入简书时间不长,才几个月,从事Android开发的时间也不长,最近在Android开发的项目中遇到了些问题,有些心得,出来分享下。

在项目中用到了RadioGroup,点击RadioButton切换Fragment,但是在切换Fragment的时候,前一个Fragment的数据没有了,再切换回去的时候一片空白,再网上找了些资料和博客,看了下他们的代码感觉逻辑不太清晰,也可能是我理解不够透彻,后来自己试验总结出自己的解决方法,主要的思想就是:切换Fragment的时候不销毁前一个Fragment,再切换回去的时候也不需要重新创建:

代码如下:

private int mCheckId;
private RadioGroup.OnCheckedChangeListener mOnCheckedChangeListener = new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
mCheckId = checkedId;
addFragment(mCheckId);
//前一个fragment
mFragmentText = createFragment(mCheckId);
}
};

private void addFragment(int checkId) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
//如果前一个fragment实例不为空
if (mFragmentText != null){
//且现有fragment实例被添加过
if (createFragment(checkId).isAdded()){
//隐藏前一个实例show出现有的之前的被隐藏的实例
transaction
.hide(mFragmentText)
.show(createFragment(checkId))
.commit();
}else {
//隐藏前一个实例,添加现有的实例
transaction
.hide(mFragmentText)
.add(R.id.fragment_home, createFragment(checkId))
.commit();
}
}else {
transaction
.add(R.id.fragment_home, createFragment(checkId))
.commit();
}
}

//切换
Fragment fragment = null;
private Fragment createFragment(int checkId) {
switch (checkId) {
case R.id.feerb1:
fragment = mFragments.get(0);
break;
case R.id.feerb2:
fragment = mFragments.get(1);
break;
case R.id.feerb3:
fragment = mFragments.get(2);
break;
case R.id.feerb4:
fragment = mFragments.get(3);
break;
default:
fragment = mFragments.get(0);
}
return fragment;

}

mHomeFragment = new HomeFragment();

mSportFragment = new SportFragment();

mRecordFragment = new RecordFragment();

mMineFragment = new MineFragment();

mFragments = new SparseArray<>();

mFragments.put(0, mHomeFragment);

mFragments.put(1, mSportFragment);

mFragments.put(2, mRecordFragment);

mFragments.put(3, mMineFragment);


我们不用replace()去切换,因为那样会销毁前一个Fragment,而是用add()添加,用hide()隐藏前一个Fragment。非常简单的一个逻辑就能实现,就是切换时前一个Fragment不销毁,而是隐藏,切换下一个前判断是否是已经添加过的,如果是就不重新创建,而是把隐藏的Fragment -->show()出来。

第一次写,大家觉得不好也不要喷,给我点鼓励,我一直在努力。谢谢!

上一篇 下一篇

猜你喜欢

热点阅读