首页 > 解决方案 > java.lang.IllegalStateException:已附加在 androidx.fragment.app.FragmentManagerImpl.attachController -

问题描述

我有viewpager多个页面,其数量取决于响应。每个片段都有带有网格项目的回收视图。看起来在设置 viewpager 应用程序崩溃时。我无法追踪崩溃发生的原因和行号。

代码:

 adapter = new NewCatPagerAdapter(getSupportFragmentManager(), categoriesResponse.categories);
        for (int i = 0; i < categoriesResponse.categories.size(); i++) {
            NewCategoriesFragment3 categoriesFragment = new NewCategoriesFragment3();
            Bundle bundle = new Bundle();
            bundle.putInt(IntentParams.CATEGORIES_POSITION, i);
            bundle.putBoolean(IntentParams.IS_FOR_RESULT, isForResult);
            bundle.putBoolean(IntentParams.IS_CROSS_BORDER, isCrossBorder);
            categoriesFragment.setArguments(bundle);
            adapter.addFragment(categoriesFragment);
        }
        setUpCategoryTitle(categoriesResponse.categories);


        vpPager = findViewById(R.id.viewPager);
        vpPager.setClipToPadding(false);
        vpPager.setPageMargin(12);
        vpPager.setOffscreenPageLimit(categoriesResponse.categories.size());
        vpPager.setAdapter(adapter);

堆栈跟踪:

java.lang.IllegalStateException: Already attached
        at androidx.fragment.app.FragmentManagerImpl.attachController(FragmentManagerImpl.java:2560)
        at androidx.fragment.app.Fragment.performAttach(Fragment.java:2553)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:828)
        at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1197)
        at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1080)
        at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:119)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1863)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1821)
        at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManagerImpl.java:1696)
        at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:299)
        at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:256)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
        at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
        at android.view.View.measure(View.java:25086)
        at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1185)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:723)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:742)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3083)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1857)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2146)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1745)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7768)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:967)
        at android.view.Choreographer.doCallbacks(Choreographer.java:791)
   at android.view.Choreographer.doFrame(Choreographer.java:726)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

NewCatPagerAdapter:

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;

import java.util.ArrayList;
import java.util.List;



// Extend from SmartFragmentStatePagerAdapter now instead for more dynamic ViewPager items
public class NewCatPagerAdapter extends FragmentStatePagerAdapter {
    private static int NUM_ITEMS = 2;
    private ArrayList<Fragment> mFragmentList = new ArrayList<>();
    private List<Category> titleList = new ArrayList<>();


    public NewCatPagerAdapter(FragmentManager fragmentManager, List<Category> titleList) {
        super(fragmentManager);
        this.titleList = titleList;
    }

    // Returns total number of pages
    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    // Returns the fragment to display for that page
    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    public void addFragment(Fragment fragment) {
        mFragmentList.add(fragment);
    }

    // Returns the page title for the top indicator
    @Override
    public CharSequence getPageTitle(int position) {
        return titleList.get(position).displayName;
    }

}

标签: androidandroid-recyclerviewandroid-viewpagerandroidx

解决方案


不清楚是什么NewCatPagerAdapter,但categoriesResponse.categories.size()不考虑的值是当前页面:

vpPager.setOffscreenPageLimit((adapter.getCount() > 1 ? adapter.getCount() - 1 : 1);

推荐阅读