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 }

浙公网安备 33010602011771号