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;
}
...全文
217 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧