1. 程式人生 > >正確使用FragmentPagerAdapter,避免Fragment重疊問題

正確使用FragmentPagerAdapter,避免Fragment重疊問題

作為一個android 開發程式設計師,大家都曾為Fragment重疊的問題所苦惱。目前解決方法也很多,我今天給大家介紹一個很簡單的方法,不需要增加任何程式碼就能解決此問題。如下:

 class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            if
(position == 0) { return new Fragment1(); } else { return new Fragment2(); } } @Override public int getCount() { return 2; } }

首先Fragment重疊是因為Activity維護了一系列的Fragment,再諸如內容重啟時,Activity不儲存Fragment的show,或hide狀態,導致Fragment重疊。那麼我們可以不讓Activity維護Fragment,讓FragmentViewPager自己維護。有人可能會問,難道每次呼叫getItem()方法都會重新建立一個Fragment嗎?當然不是,下面我們來看下FragmentPagerAdapter的原始碼。

@Override
    public Object instantiateItem(ViewGroup container, int position) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }

        final long itemId = getItemId(position);

        // Do we already have this fragment?
        String name = makeFragmentName(container
.getId(), itemId); Fragment fragment = mFragmentManager.findFragmentByTag(name); if (fragment != null) { if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment); mCurTransaction.attach(fragment); } else { fragment = getItem(position); if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment); mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId)); } if (fragment != mCurrentPrimaryItem) { fragment.setMenuVisibility(false); fragment.setUserVisibleHint(false); } return fragment; }

如果FragmentManager已存在此Fragment,則重新繫結(因為在destroyItem()方法中對Fragment進行了解綁),否則才通過getItem()方法獲取Fragment。