【问题标题】:Fragment already added IllegalStateException with only one copy of fragmentFragment 已经添加了 IllegalStateException,只有一份 Fragment 副本
【发布时间】:2015-10-17 03:32:26
【问题描述】:

我知道关于这个异常有几个问题,但是,我在使用 FragmentStatePagerAdapter 时遇到了这个异常,只有一个任务。

我在下面指出我在设置适配器和寻呼机时遇到崩溃的线路。

设置我的Fragments:

android.support.v4.app.FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.add(0, new StarTabFragment(), "starTab");
t.add(0, new HierarchiesTabFragment(), "hierarchyTab");
t.add(0, new GroupsTabFragment(), "groupTab");
t.add(0, new VehiclesTabFragment(), "hierarchyTab");
t.commit();

设置我的适配器和寻呼机:

viewPager = (ViewPager) mDrawerLayoutRight.findViewById(R.id.pager);
PagerTabStrip tabs = (PagerTabStrip) mDrawerLayoutRight.findViewById(R.id.pager_tab_strip);
tabs.setTabIndicatorColor(Color.RED);

CustomPagerAdapter customPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager());
viewPager.setOffscreenPageLimit(customPagerAdapter.getCount() - 2);
viewPager.setAdapter(customPagerAdapter); //crashing here
viewPager.setOnPageChangeListener(new LoopingPageChangeListener(viewPager));
viewPager.setCurrentItem(1);

堆栈跟踪:

at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:876)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5343)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Caused by: java.lang.IllegalStateException: Fragment already added: StarTabFragment{d12eb55 #1 id=0x7f0b0116 starTab}
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1197)
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:673)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486)
    at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
    at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:447)
    at com.company.activities.MapsActivity.setupSliderRight(MapsActivity.java:847)
    at com.company.activities.MapsActivity.access$2100(MapsActivity.java:112)
    at com.company.activities.MapsActivity$DBHierarchyResponseReceiver.onReceive(MapsActivity.java:2287)
    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:866)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5343)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

【问题讨论】:

    标签: android


    【解决方案1】:

    有时这似乎是在加载片段时发生某些事情时引发的一般错误。

    例如:当我在 onCreateView 中调用 findViewById 时出现了这个错误,并且使用了片段布局中不存在的错误 id。

    所以,请确保您的片段 onCreateView 的代码没有任何错误(尝试全部注释 - 只返回原始膨胀视图 - 看看它是否仍然抛出此错误。

    【讨论】:

    • 谢谢,这节省了很多时间!
    • 这条评论还是有用的。我 findViewById 到了一个错误的类,也得到了这个错误。太奇怪了,在我的情况下,为什么他们不只是抛出像“Cannot cast class....”这样的错误......
    【解决方案2】:

    添加片段的方式不一定有问题。由于我遇到了类似的问题,后来当我使用调试器逐步找到真正的问题时,结果发现问题在于片段布局中的视图。

    我遇到了和你类似的异常,但真正的异常是

    java.lang.ClassCastException:
    

    【讨论】:

    • 为什么要投反对票?在投反对票之前,您应该先重现上述问题。
    • 你说的对,我一步步调试了app,发现问题出在别处,谢谢
    • @Amin Keshavarzian 感谢您的确认。
    • @jatin rana 我遇到了与片段布局相关的相同问题。你的评论帮助我解决了这个问题。谢谢!
    • @IgorOK 好朋友。
    【解决方案3】:

    问题是我将Fragments 预先添加到经理中。 FragmentPagerAdapter 自动将所有Fragments 添加到getItem() 方法中的管理器中。

    有关getItem() 方法的详细信息,请参阅this answer

    【讨论】:

      【解决方案4】:

      不确定是否有很多人可能会因为与我相同的原因而面临这个问题,但是 传递性 一直导致 java.lang.IllegalStateException: Fragment already added 的一个小错误是我使用了自定义 @ 987654322@上课。

      onCreateView 方法中,我使用inflater.inflate() 扩展了我的布局,我忘记使用attachToRoot 的方法作为false。我解决这个问题的那一刻,我的问题就解决了。

      说明:

      带签名的方法:

      inflate(@LayoutRes int resource, @Nullable ViewGroup root)

      返回root(父ViewGroup)而不是新膨胀的View的根。来自 JavaDocs:

      @return:膨胀层次结构的根View。如果提供了 root,这是 根View;否则它是膨胀的 XML 文件的根。

      如果您使用以下方法,可能会发生类似情况: inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)attachToRoot : true

      Fragment 尝试将根布局添加为自身的子元素,这会导致 java.lang.IllegalStateException: The specified child already has a parent

      滚雪球到我们原来的java.lang.IllegalStateException: Fragment already added

      希望这对某人有所帮助。

      【讨论】:

        【解决方案5】:

        我也遇到过同样的问题,原来是复制片段代码造成的。 Android Studio 自动重构了方法,所以我得到了这个:

            public static Fragment newInstance(Bundle args) {
            PurchaseOfferFragment frag = new PurchaseOfferFragment();
            frag.setArguments(args);
            return  frag;
        }
        

        不这样做:

            public static PurchaseOfferFragment newInstance(Bundle args) {
            PurchaseOfferFragment frag = new PurchaseOfferFragment();
            frag.setArguments(args);
            return  frag;
        }
        

        导致无法跟踪的 IlleGalStateException。

        导致我无法跟踪抛出异常的错误。 只需将“Fragment”更改为 PurchaseOfferFragment 即可 100% 解决问题。

        在静态方法中检查您的片段名称是否正确,同时从现有片段中复制和粘贴,以节省我失去的一些时间!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-22
          • 2021-01-15
          • 1970-01-01
          • 2014-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多