您的位置:首页 > 编程语言 > PHP开发

关于fragmentPagerAdapter的冲突问题

2016-06-16 10:04 609 查看
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冲突的问题。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: