我在viewPager中有几页(片段) 当我试图删除(例如)第一个时,像这样:
mFragmentManager.beginTransaction().remove(Page1).commit();
它说
IllegalStateException has occured.
我不知道为什么。有人能帮助我吗?感谢。
例外:
java.lang.IllegalStateException: Can't change tag of fragment Page2{40586418 #2 id=0x7f080006 android:switcher:2131230726:2}: was android:switcher:2131230726:2 now android:switcher:2131230726:1
答案 0 :(得分:2)
这是一个老问题,但无论如何这里有一些信息,希望它能帮助某人。
ViewPager与其适配器一起工作,该适配器通过ViewPager#setAdapter()设置。 在这个问题的情况下,似乎FragmentPagerAdapter被用作适配器(因为这个适配器命名片段android:switcher:[x]:[y],如异常中所示)。
关于FragmentPagerAdapter的一个重要观察是:
FragmentPagerAdapter拥有ViewPager中使用的已分配片段。
ViewPager的用户与ViewPagerAdapter一起必须定义一个实现getItem()方法的FragmentPagerAdapter的子类,原型如下:
public abstract Fragment getItem(int position);
此函数创建ViewPager用作页面的不同片段。 应该将此方法的实现视为子类提供给FragmentPagerAdapter()的服务,以分配片段。
换句话说,虽然子类分配片段,但它不是它们的所有者。
因为,如上所述,片段的所有者是FragmentPagerAdapter,所有片段操作(在FragmentManager / FragmentTransaction意义上)必须只能由FragmentPagerAdapter完成。
尝试对这些片段执行操作可能会干扰ViewPager的正常操作并导致未定义的行为。
在这个问题的情况下,尝试删除ViewPager在FragmentPagerAdapter之外使用的一个片段,因为这些片段很糟糕并且可能触发了以此异常结束的序列。
当需要动态删除/添加/替换ViewPager中的页面时,可以在适配器上调用notifyDataSetChanged()。
祝你好运!