ViewPager和FragmentTranstion的之间Tag问题
天极者 2016-10-02 03:30:09 问题是这样的:
界面:一个Acitvity里有一个Viewpager,Viewpager装载多个Fragment
设置:Activity需要给装载的这些fragment设置tag,以便通过tag快速找到fragment,但是fragmentpageradapter也需要给fragment设置tag,然后由于FragmentTransaction先设置了tag,导致fragmentpageradapter设置tag失败报错:java.lang.IllegalStateException: Can’t change tag of fragment
下面是详细说明:
Activity里是这样写的
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.add(zixun, "newsDetail");
fragmentTransaction.add(cf, "newsComment");
fragmentTransaction.commit();
adapter = new ZixunFragmentPagerAdapter(fm, fragmentList); ←问题出现了
viewPager.setAdapter(adapter);
问题就在这个地方,基类FragmentPagerAdapter的instantiateItem方法会给fragment设置tag,官方说需要重写这个方法,但是网上资料很少啊
@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;
}
简单的说,就是通过FragmentTransaction已经添加了tag,而viewpageradpater也要添加tag,然后直接报错
java.lang.IllegalStateException: Can’t change tag of fragment PageFragment{42ef29a8 #14 id=0x7f060052 android:switcher:2131099730:22}: was android:switcher:2131099730:22 now android:switcher:2131099730:17
因为不太了解FragmentPagerAdatper设置tag的原理,所以在使用的时候,我都是通过查看基类FragmentPagerAdatper源码里的方法再重写的instantiateItem方法里加入一段查看fragment的Tag的方法,然后通过fm.findFragmentByTag("android:switcher:2131558504:1");找到这个fragment,但是这可以说意义不大,有时候新建了一些fragment,这个tag就会变化
@Override
public Object instantiateItem(ViewGroup container, int position) {
/**
* 查看添加进来的fragment的tag
*/
final long itemId = getItemId(position);
String name = makeFragmentName(container.getId(), itemId);
Log.e("tag", "instantiateItem: fragment的tag是:"+name);
return super.instantiateItem(container, position);
}
private static String makeFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}