ViewPager和Fragment使用笔记

今天使用ViewPager配上Fragment出现了一个问题,当fragment被回收后显示的为空白,一开始实在是摸不着头脑,最后去看了FragmentAdapter的源码,在Fragment被回收后,FragmentManager会执行detach这个frament实例销毁布局

    @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());
        mCurTransaction.detach((Fragment)object);
    }

 

下次再初始化这个Fragment的时候,FragmentManager会执行attch,Fragment的就会执行onCreateView,所以问题就出在这里,在onCreateView里面最好对View进行判断,为null的时候加载布局实例化控件

 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             mCurTransaction.attach(fragment);
15         } else {
16             fragment = getItem(position);
17             if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
18             mCurTransaction.add(container.getId(), fragment,
19                     makeFragmentName(container.getId(), itemId));
20         }
21         if (fragment != mCurrentPrimaryItem) {
22             fragment.setMenuVisibility(false);
23             fragment.setUserVisibleHint(false);
24         }
25 
26         return fragment;
27     }

 

posted @ 2016-01-31 15:36  LinuxCC  阅读(273)  评论(0)    收藏  举报