这是一个老问题,但无论如何这里有一些信息,希望它能帮助某人。
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()。
祝你好运!