在ViewPager中替换片段会导致IllegalStateException

时间:2017-07-27 12:34:53

标签: android android-viewpager 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;
    }

}

根据其他帖子,这个异常似乎是由于重复添加相同的片段,或者错误计算了片段的数量,但我无法看到其中任何一个发生的地方,如果有的话?显然,我错过了一些东西。我将不胜感激任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

要在View Pager的一个标签页中转换SWAP片段,您必须以不同的方式执行此操作:

您需要一个位于ViewPager中的片段作为容器。由ViewPager管理。这个片段总是在选项卡中,从不交换或更改。

在Fragment中你有2个子片段,你可以使用ChildFragmentManager的事务进行交换。但ViewPager甚至不知道他们的存在。