Android -- Fragment切换数据丢失
加入简书时间不长,才几个月,从事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()出来。
第一次写,大家觉得不好也不要喷,给我点鼓励,我一直在努力。谢谢!