FragmentManager 已经在执行事务.提交后何时初始化寻呼机是安全的? [英] FragmentManager is already executing transactions. When is it safe to initialise pager after commit?

查看:23
本文介绍了FragmentManager 已经在执行事务.提交后何时初始化寻呼机是安全的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个活动托管两个片段.该活动在加载对象时开始显示加载器.然后通过 newInstance 方法将加载的对象作为参数传递给两个片段,并附加这些片段.

I have an activity hosting two fragments. The activity starts off showing a loader while it loads an object. The loaded object is then passed to both fragments as arguments via newInstance methods and those fragments are attached.

final FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.container1, Fragment1.newInstance(loadedObject));
trans.replace(R.id.container2, Fragment2.newInstance(loadedObject));
trans.commit();

第二个片段包含一个 android.support.v4.view.ViewPager 和选项卡.onResume 我们像下面这样初始化它

The second fragment contains a android.support.v4.view.ViewPager and tabs. onResume we initialise it like follows

viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(adapter.getCount()); //the count is always < 4
tabLayout.setupWithViewPager(viewPager);

问题是android然后抛出

The problem is android then throws

java.lang.IllegalStateException: FragmentManager 已经在执行交易

java.lang.IllegalStateException: FragmentManager is already executing transactions

使用此堆栈跟踪:(为了简洁起见,我从包名称中取出了 android.support)

With this stack trace: (I took android.support out of the package names just for brevity)

v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1620)在v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:637)在v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)在 v4.view.ViewPager.populate(ViewPager.java:1235)在 v4.view.ViewPager.populate(ViewPager.java:1083)在v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:847)

v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1620) at v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:637) at v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) at v4.view.ViewPager.populate(ViewPager.java:1235) at v4.view.ViewPager.populate(ViewPager.java:1083) at v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:847)

数据显示是否删除了 setOffscreenPageLimit(...);.还有其他方法可以避免这个问题吗?

The data shows if setOffscreenPageLimit(...); is removed. Is there another way to avoid this issue?

在生命周期中片段事务何时完成以便我可以等待设置我的寻呼机?

When in the lifecycle is the fragment transaction complete so that I can wait to setup my pager?

推荐答案

如果您的目标是 sdk 24 及更高版本,您可以使用:

If you're targeting sdk 24 and above you can use:

FragmentTransaction.commitNow()

代替commit()

如果您的目标是旧版本,请尝试调用:

If you're targeting older versions, try calling:

FragmentManager.executePendingTransactions()

在调用 commit()

这篇关于FragmentManager 已经在执行事务.提交后何时初始化寻呼机是安全的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆