Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 使用ViewPager切換Fragment時,防止頻繁調用OnCreatView,fragmentoncreat

使用ViewPager切換Fragment時,防止頻繁調用OnCreatView,fragmentoncreat

編輯:關於android開發

使用ViewPager切換Fragment時,防止頻繁調用OnCreatView,fragmentoncreat


使用ViewPager切換Fragment,我原先使用系統自帶的適配器FragmentPagerAdapter。

切換fragment時,頻繁調用oncreatview()。

查看FragmentPagerAdapter的源碼,發現兩個關鍵的地方

 1 @Override
 2     public Object instantiateItem(ViewGroup container, int position) {
 3         if (mCurTransaction == null) {
 4             mCurTransaction = mFragmentManager.beginTransaction();
 5         }
 6 
 7         final long itemId = getItemId(position);
 8 
 9         // Do we already have this fragment?
10         String name = makeFragmentName(container.getId(), itemId);
11         Fragment fragment = mFragmentManager.findFragmentByTag(name);
12         if (fragment != null) {
13             if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
14            //該處使用attach導致頻繁調用oncreatview
15             mCurTransaction.attach(fragment);
16 
17         } else {
18             fragment = getItem(position);
19             if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
20             mCurTransaction.add(container.getId(), fragment,
21                     makeFragmentName(container.getId(), itemId));
22         }
23         if (fragment != mCurrentPrimaryItem) {
24             fragment.setMenuVisibility(false);
25             fragment.setUserVisibleHint(false);
26         }
27 
28         return fragment;
29     }
30 
31     @Override
32     public void destroyItem(ViewGroup container, int position, Object object) {
33         if (mCurTransaction == null) {
34             mCurTransaction = mFragmentManager.beginTransaction();
35         }
36         if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
37                 + " v=" + ((Fragment)object).getView());
38         //該處使用detach導致頻繁調用oncreatview
39         mCurTransaction.detach((Fragment)object);
40     }

attach和detach的頻繁使用導致了fragment頻繁調用oncreatview。

找到元凶了,接下來就好辦了。

自定義一個適配器,將attach改為show,將detach改為hide。

完美解決問題。

@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);
            //用show而不用attach,防止頻繁調用oncreatview
            mCurTransaction.show(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;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
        if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
                + " v=" + ((Fragment) object).getView());
        //用hide而不用detach,防止頻繁調用oncreatview
        mCurTransaction.hide((Fragment) object);
    }
View Code

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved