加入簡書時(shí)間不長,才幾個(gè)月缔赠,從事Android開發(fā)的時(shí)間也不長,最近在Android開發(fā)的項(xiàng)目中遇到了些問題友题,有些心得嗤堰,出來分享下。
在項(xiàng)目中用到了RadioGroup度宦,點(diǎn)擊RadioButton切換Fragment踢匣,但是在切換Fragment的時(shí)候,前一個(gè)Fragment的數(shù)據(jù)沒有了戈抄,再切換回去的時(shí)候一片空白离唬,再網(wǎng)上找了些資料和博客,看了下他們的代碼感覺邏輯不太清晰划鸽,也可能是我理解不夠透徹输莺,后來自己試驗(yàn)總結(jié)出自己的解決方法,主要的思想就是:切換Fragment的時(shí)候不銷毀前一個(gè)Fragment裸诽,再切換回去的時(shí)候也不需要重新創(chuàng)建:
代碼如下:
private int mCheckId;
private RadioGroup.OnCheckedChangeListener mOnCheckedChangeListener = new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
mCheckId = checkedId;
addFragment(mCheckId);
//前一個(gè)fragment
mFragmentText = createFragment(mCheckId);
}
};
private void addFragment(int checkId) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
//如果前一個(gè)fragment實(shí)例不為空
if (mFragmentText != null){
//且現(xiàn)有fragment實(shí)例被添加過
if (createFragment(checkId).isAdded()){
//隱藏前一個(gè)實(shí)例show出現(xiàn)有的之前的被隱藏的實(shí)例
transaction
.hide(mFragmentText)
.show(createFragment(checkId))
.commit();
}else {
//隱藏前一個(gè)實(shí)例,添加現(xiàn)有的實(shí)例
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()去切換嫂用,因?yàn)槟菢訒N毀前一個(gè)Fragment,而是用add()添加丈冬,用hide()隱藏前一個(gè)Fragment嘱函。非常簡單的一個(gè)邏輯就能實(shí)現(xiàn),就是切換時(shí)前一個(gè)Fragment不銷毀埂蕊,而是隱藏往弓,切換下一個(gè)前判斷是否是已經(jīng)添加過的,如果是就不重新創(chuàng)建蓄氧,而是把隱藏的Fragment -->show()出來函似。
第一次寫,大家覺得不好也不要噴匀们,給我點(diǎn)鼓勵(lì)缴淋,我一直在努力准给。謝謝泄朴!