5

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

1 回答 1

2

这是一个老问题,但无论如何这里有一些信息,希望它能帮助某人。

ViewPager 与其通过 ViewPager#setAdapter() 设置的适配器一起工作。在这个问题的情况下,似乎 FragmentPagerAdapter 被用作适配器(因为这个适配器将片段命名为 android:switcher:[x]:[y] 出现在异常中)。

关于 FragmentPagerAdapter 的一个重要观察是:

FragmentPagerAdapter 拥有在 ViewPager 中使用的已分配片段。

ViewPager 的用户结合 ViewPagerAdapter 必须定义一个 FragmentPagerAdapter 的子类来实现 getItem() 方法,原型如下:

public abstract Fragment getItem(int position);

此函数创建 ViewPager 使用的不同片段作为页面。这个方法的实现应该被看作是子类为 FragmentPagerAdapter() 提供的用于分配片段的服务。

换句话说,尽管子类分配了片段,但它不是它们的所有者。

由于如上所述,片段的所有者是 FragmentPagerAdapter,因此所有片段操作(在 FragmentManager/FragmentTransaction 的意义上)只能由 FragmentPagerAdapter 完成。

尝试对这些 Fragment 执行操作可能会干扰 ViewPager 的正常操作并导致未定义的行为。

在这个问题的情况下,试图删除 ViewPager 在 FragmentPagerAdapter 之外使用的片段之一,正如所解释的那样是坏的,并且可能触发了一个以这个异常结束的序列。

当需要在 ViewPager 中动态删除/添加/替换页面时,可以在适配器上调用 notifyDataSetChanged()。

祝你好运!

于 2015-03-31T22:28:31.380 回答