替换 ViewPager 中的片段导致 IllegalStateException

Replacing fragment in ViewPager causes IllegalStateException

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;
    }

}

根据其他帖子,此异常似乎是由于重复添加相同片段或错误计算片段数量引起的,但我根本看不出这两种情况发生在哪里?显然我错过了一些东西。我将不胜感激任何帮助。谢谢。

您在初始化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;
        }
    }

要在 View Pager 的一个选项卡中交换片段,您必须以不同的方式进行:

您需要在 ViewPager 中充当容器的片段。它由 ViewPager 管理。此 Fragment 始终存在于选项卡中,从不交换或更改。

在该片段中,您有 2 个子片段,您可以使用 ChildFragmentManager 的事务来交换它们。但是 ViewPager 甚至不知道它们的存在。