android - 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;
}
}
解决方案
不清楚是什么NewCatPagerAdapter
,但categoriesResponse.categories.size()
不考虑的值是当前页面:
vpPager.setOffscreenPageLimit((adapter.getCount() > 1 ? adapter.getCount() - 1 : 1);
推荐阅读
- openstack - openstack 发出一个没有过期时间的令牌
- sql - 在 PostgreSQL 中将时间转换为十进制数据类型
- proxy - Windows Server Core 2022 - 使用用户/密码添加代理
- nginx - 使用 nginx 正则表达式的位置
- javascript - doPost 函数执行两次(谷歌应用脚本)
- html - 当 sidbar 展开时使背景透明且不活动
- javascript - 如何在 Vue.js 中使用 Day.js 格式化日期
- python - 如何使用kotak证券交易api登录?
- javascript - Puppeteer 有时无法找到元素匹配选择器,但我等待它
- flutter - 如何标记(启用/禁用)Flutter RefreshIndicator