【问题标题】:Replacing fragment in ViewPager causes IllegalStateException在 ViewPager 中替换片段会导致 IllegalStateException
【发布时间】:2018-01-03 04:40:11
【问题描述】:

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

}

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

【问题讨论】:

  • 你为什么要在 viewpager 中使用片段管理器?在 getitem 中,您只需要返回 Fragment 的一个实例。 ViewPager 管理片段实例的生命周期。
  • 因为我正在尝试在一个选项卡中进行片段交换。

标签: android android-viewpager illegalstateexception


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢你的建议。如果它有效,我会在稍后回来并标记它是正确的。
【解决方案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;
        }
    }

【讨论】:

  • 我很确定 null 是 java 中对象的默认值。不过还是谢谢。
  • 是的,但如果你在它之前初始化了它,它就不会回到 null。因此,如果您在一个片段上并且仍处于同一活动中,则该片段不会变为 null,但在您单击另一个片段时仍会被初始化。
  • 啊,你当然是对的。但我选择了另一个答案并将您的答案标记为有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 2014-03-28
相关资源
最近更新 更多