关于fragmentPagerAdapter的冲突问题

来源:互联网 发布:360手机代工厂 知乎 编辑:程序博客网 时间:2024/06/07 21:59
  fragmentPagerAdapter是继承了PagerAdapter,这个类的作用就是用于滑动跳转Fragment,但是这个类是V4包里独有的,
android app包里并没有这个类,那么问题就来了,当自己前面用的Fragment以及fragmentmanager都是app包下的,两者无法兼容,那该怎么办?
  本人找了两种办法解决这个方案:第一种便是将所有的fragment全部换成V4包下的,但是这样也会有许多不兼容的因素出现。
  第二种就是打开fragmentPagerAdapter这个类的源码,然后自己新建一个类,将它copy到这个类里,然后将里面所有V4的包全部改成app的,代码如下:
public class MyPageAdapter extends PagerAdapter {    private final FragmentManager mFragmentManager;    private FragmentTransaction mCurTransaction = null;    private Fragment mCurrentPrimaryItem = null;    private List<Fragment> fragmentList;    public MyPageAdapter(FragmentManager fm, List<Fragment> fragmentList) {        mFragmentManager = fm;        this.fragmentList = fragmentList;    }    public Fragment getItem(int position) {        return fragmentList.get(position);    }    @Override    public int getCount() {        return fragmentList.size();    }    @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) {            mCurTransaction.attach(fragment);        } else {            fragment = getItem(position);            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();        }        mCurTransaction.detach((Fragment)object);    }    @Override    public void setPrimaryItem(ViewGroup container, int position, Object object) {        Fragment fragment = (Fragment)object;        if (fragment != mCurrentPrimaryItem) {            if (mCurrentPrimaryItem != null) {                mCurrentPrimaryItem.setMenuVisibility(false);                mCurrentPrimaryItem.setUserVisibleHint(false);            }            if (fragment != null) {                fragment.setMenuVisibility(true);                fragment.setUserVisibleHint(true);            }            mCurrentPrimaryItem = fragment;        }    }    @Override    public void finishUpdate(ViewGroup container) {        if (mCurTransaction != null) {            mCurTransaction.commitAllowingStateLoss();            mCurTransaction = null;            mFragmentManager.executePendingTransactions();        }    }    @Override    public boolean isViewFromObject(View view, Object object) {        return ((Fragment)object).getView() == view;    }    @Override    public Parcelable saveState() {        return null;    }    @Override    public void restoreState(Parcelable state, ClassLoader loader) {    }    /**     * Return a unique identifier for the item at the given position.     *     * <p>The default implementation returns the given position.     * Subclasses should override this method if the positions of items can change.</p>     *     * @param position Position within this adapter     * @return Unique identifier for the item at position     */    public long getItemId(int position) {        return position;    }    private static String makeFragmentName(int viewId, long id) {        return "android:switcher:" + viewId + ":" + id;    }}
如此便解决了fragmentPagerAdapter冲突的问题。


0 0
原创粉丝点击