正確使用FragmentPagerAdapter,避免Fragment重疊問題
阿新 • • 發佈:2019-01-08
作為一個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。