Android有一個(gè)回收機(jī)制漆改,當(dāng)內(nèi)存不足時(shí)俘枫,會(huì)自動(dòng)回收相關(guān)內(nèi)存钟病。
我們使用FragmentActivity放入Fragment的方法實(shí)現(xiàn)app的導(dǎo)航功能。
oncreate方法中姑子,初始化Fragment數(shù)組嗤放,代碼如下:
private void initFragmentTab() {
HomeFragment homeFragment = new HomeFragment();
StyleFragment styleFragment = new StyleFragment();
ShopFragment shopFragment = new ShopFragment();
FoundFragment foundFragment = new FoundFragment();
MeFragment meFragment = new MeFragment();
fragments = new Fragment[]{homeFragment, styleFragment, shopFragment, foundFragment, meFragment};
}
Fragment首頁(yè)的添加代碼如下:
FragmentTransaction begin = fragmentManager.beginTransaction();
begin.add(R.id.fragment_container, fragments[HOME_FRAGMENT_INDEX], HOME_FRAGMENT_INDEX + "").show(fragments[HOME_FRAGMENT_INDEX]).commit();
Fragment的切換實(shí)現(xiàn)代碼如下:
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (!fragments[currentIndex].isHidden()) {
transaction.hide(fragments[currentIndex]);
}
if (!fragments[index].isAdded()) {
transaction.add(R.id.fragment_container, fragments[index], "" + index);
}
transaction.show(fragments[index]).commit();
currentIndex:當(dāng)前fragment下標(biāo)索引
index:準(zhǔn)備跳轉(zhuǎn)的下標(biāo)索引。
在正常情況下壁酬,F(xiàn)ragment的切換成功次酌。但當(dāng)同時(shí)打開別的app導(dǎo)致終端內(nèi)存不足,回收FragmentActivity舆乔。此時(shí)可以發(fā)現(xiàn)FragmentActivity切換不成功岳服,一致停留在某一Fragment上。
經(jīng)過(guò)調(diào)試希俩,App內(nèi)存不足時(shí)吊宋,Activity被回收,再次回到Activity時(shí)颜武,oncreate方法再次被執(zhí)行璃搜,此時(shí)Fragment數(shù)組則是被新實(shí)例化拖吼。在執(zhí)行切換時(shí)hide與show方法操作的是新的實(shí)例,然而顯示在屏幕上的卻是原先的Fragment这吻。這就是Fragment切換失敗的原因吊档。
了解了bug之后唾糯,我們可以做出相關(guān)的方法怠硼,方法很多,下面是我的一個(gè)解決方案:
在每次調(diào)用ActivityFragment的oncreate方法時(shí)移怯,把原先放入的Fragment全部清空香璃。代碼如下:
private void removeAllFragment(){
FragmentTransaction begin = fragmentManager.beginTransaction();
for (int i = 0; i < FragmentCount; i++) {
Fragment f = fragmentManager.findFragmentByTag(i + "");
if (f != null && f.isAdded()) {
begin.remove(f);
}
}
begin.commit();
}
然后在進(jìn)行ActivityFragment的初始化工作。
測(cè)試通過(guò)舟误!