1. 程式人生 > >activity被回收後,點選Tab無法切換fragment

activity被回收後,點選Tab無法切換fragment

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;
        }
	}