【问题标题】:java.lang.IllegalStateException: Already attached at androidx.fragment.app.FragmentManagerImpl.attachController -java.lang.IllegalStateException:已附加在 androidx.fragment.app.FragmentManagerImpl.attachController -
【发布时间】:2020-02-01 13:41:55
【问题描述】:

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

}

【问题讨论】:

  • 这与片段附件有关,与viewpager无关。
  • 是的,我提到了它。它工作正常。突然它开始出错了。
  • 请分享NewCatPagerAdapter源代码。
  • 我找不到您的 Adapter 实现有什么问题,也许您的 Activity 实现有问题。例如,如果您在活动中调用super.onCreate 方法两次,您将得到类似的异常。
  • 不,我没有调用 super.onCreate 两次

标签: android android-recyclerview android-viewpager androidx


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    为了测试,我试图找出您的问题,但在我这边工作正常! 这是代码:

    public class MainActivity extends AppCompatActivity {
    
        ViewPager vpPager;
        CatPagerAdapter adapter;
        List<String>list  = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            vpPager = findViewById(R.id.viewPager);
            list.add("One");
            list.add("Two");
            list.add("Three");
            list.add("Four");
            list.add("Five");
            adapter = new CatPagerAdapter(getSupportFragmentManager(), list);
            for (int i = 0; i < 4; i++) {
                FirstFragment categoriesFragment = new FirstFragment();
                Bundle bundle = new Bundle();
    
                adapter.addFragment(categoriesFragment);
            }
            //setUpCategoryTitle(categoriesResponse.categories);
    
    
            vpPager = findViewById(R.id.viewPager);
            vpPager.setClipToPadding(false);
            vpPager.setPageMargin(12);
            vpPager.setOffscreenPageLimit(5);
            vpPager.setAdapter(adapter);
        }
    }
    

    布局:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <androidx.viewpager.widget.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </RelativeLayout>
    

    适配器:

    public class CatPagerAdapter extends FragmentStatePagerAdapter {
    
        private static int NUM_ITEMS = 2;
        private ArrayList<Fragment> mFragmentList = new ArrayList<>();
        private List<String> titleList = new ArrayList<>();
    
        public CatPagerAdapter(@NonNull FragmentManager fm, List<String>list) {
    
            super(fm);
            titleList = list;
        }
    
    
        @NonNull
        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }
    
        @Override
        public int getCount() {
            return mFragmentList.size();
        }
    
    
        public void addFragment(Fragment fragment) {
            mFragmentList.add(fragment);
        }
    
    
        @Override
        public CharSequence getPageTitle(int position) {
            return "";
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 2017-08-08
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多