activity被回收後,點選Tab無法切換fragment
阿新 • • 發佈:2018-12-12
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; } }