无法更改片段的标记

时间:2012-03-07 19:04:17

标签: android android-viewpager fragmentpageradapter

我在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

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()。

祝你好运!