关注this example我试图在ViewPager的单个标签中替换另一个广告。我得到了这个例外:
java.lang.IllegalStateException: Can't change tag of fragment DailyWordFragment
class ViewPagerAdapter extends FragmentPagerAdapter {
private final FragmentManager fragmentManager;
Fragment fragment;
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
fragmentManager = manager;
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
if(fragment == null){
fragment = DailyWordFragment.newInstance();
}
return fragment;
case 1:
if(fragment == null){
fragment = WordListFragment.newInstance(new WordListFragment.OnWordItemAddListener() {
@Override
public void onWordItemAddListener() {
fragmentManager.beginTransaction().remove(fragment).commit();
fragment = AddWordFragment.newInstance();
notifyDataSetChanged();
}
});
}
return fragment;
default:
return null;
}
}
@Override
public int getItemPosition(Object object) {
if(object instanceof WordListFragment && fragment instanceof AddWordFragment)
return POSITION_NONE;
return POSITION_UNCHANGED;
}
@Override
public int getCount() {
return 2;
}
}
根据其他帖子,这个异常似乎是由于重复添加相同的片段,或者错误计算了片段的数量,但我无法看到其中任何一个发生的地方,如果有的话?显然,我错过了一些东西。我将不胜感激任何帮助。谢谢。
答案 0 :(得分:1)
在初始化Fragment以将其设置为null之前,您是否尝试过?
@Override
public Fragment getItem(int position) {
fragment = null
switch (position){
case 0:
if(fragment == null){
fragment = DailyWordFragment.newInstance();
}
return fragment;
case 1:
if(fragment == null){
fragment = WordListFragment.newInstance(new WordListFragment.OnWordItemAddListener() {
@Override
public void onWordItemAddListener() {
fragmentManager.beginTransaction().remove(fragment).commit();
fragment = AddWordFragment.newInstance();
notifyDataSetChanged();
}
});
}
return fragment;
default:
return null;
}
}
答案 1 :(得分:0)
要在View Pager的一个标签页中转换SWAP片段,您必须以不同的方式执行此操作:
您需要一个位于ViewPager中的片段作为容器。由ViewPager管理。这个片段总是在选项卡中,从不交换或更改。
在Fragment中你有2个子片段,你可以使用ChildFragmentManager的事务进行交换。但ViewPager甚至不知道他们的存在。