片段已经添加了IllegalStateException,只有一个片段

时间:2015-10-17 03:32:27

标签: android

我知道有关于此异常的几个问题,但是,我在使用FragmentStatePagerAdapter时只有一个分配遇到此异常。

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

设置我的Fragment

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)

5 个答案:

答案 0 :(得分:4)

问题是我正在将Fragment预先添加到经理。 FragmentPagerAdapter会自动将所有Fragment添加到getItem()方法中的经理。

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

答案 1 :(得分:4)

似乎有时这是在加载片段时发生某些错误。

例如:我在onCreateView内以错误的ID调用findViewById时出现此错误,该错误在片段的布局上不存在。

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

答案 2 :(得分:1)

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

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

java.lang.ClassCastException:

答案 3 :(得分:0)

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

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

希望这对某人有帮助。

答案 4 :(得分:0)

我遇到了完全相同的问题,事实证明是由复制片段代码引起的。 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%。

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