FragmentManager 已经在执行事务。提交后何时初始化寻呼机是安全的?

新手上路,请多包涵

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

 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 我们像下面这样初始化它

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

问题是android然后抛出

java.lang.IllegalStateException: FragmentManager 已经在执行事务

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

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)

数据显示 setOffscreenPageLimit(...); 是否被移除。有没有其他方法可以避免这个问题?

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

原文由 Nick Cardoso 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 348
2 个回答

只需将 childFragmentManger() 用于 viewpagerFragment

 mPagerAdapter = new ScreenSlidePagerAdapter(getChildFragmentManager());
mPager.setAdapter(mPagerAdapter);

原文由 Hitesh Sahu 发布,翻译遵循 CC BY-SA 3.0 许可协议

只是不要在另一个事务过程中从已经在同一个 FragmentManager 的片段中调用 FragmentTransaction#commit()

例如:

活动:

  override fun onCreate(savedInstanceState: Bundle?) {
     val fragment = MyFragment()
     setFragment(fragment)
    }

    fun setFragment(fragment: Fragment){
        supportFragmentManager.beginTransaction()
            .replace(...,fragment, ...)
            .commit()
     }

我的片段:

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
/*
*  here error will occurs, because the fragment MyFragment is in current transaction
*/
activity?.setFragment(AnotherFragment())//error
}

解决方案:

做这个:

活动:

  override fun onCreate(savedInstanceState: Bundle?) {

     setFragment(MyFragment())
    ...
    setFragment(AnotherFragment())
    }

    fun setFragment(fragment: Fragment){
        supportFragmentManager.beginTransaction()
            .replace(...,fragment, ...)
            .commit()
     }

原文由 NickUnuchek 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏