Android putFragment()-片段x当前不在FragmentManager中

Android putFragment()-片段x当前不在FragmentManager中,android,android-fragments,fragment-backstack,Android,Android Fragments,Fragment Backstack,上面的标题被问了很多,但答案似乎与FragmentStatePagerAdapter密切相关,这与我的问题无关。我直接使用方法putFragment(Bundle,String,Fragment) forputFragment(Bundle、String、Fragment)表示: Put a reference to a fragment in a Bundle. This Bundle can be persisted as saved state, and when later restor

上面的标题被问了很多,但答案似乎与
FragmentStatePagerAdapter
密切相关,这与我的问题无关。我直接使用方法
putFragment(Bundle,String,Fragment)

for
putFragment(Bundle、String、Fragment)
表示:

Put a reference to a fragment in a Bundle. This Bundle can be persisted as saved state, and when later restoring getFragment(Bundle, String) will return the current instance of the same fragment.

Parameters
* bundle        The bundle in which to put the fragment reference.
* key           The name of the entry in the bundle.
* fragment  The Fragment whose reference is to be stored.
但是,以下代码引发异常:

Bundle bundle = new Bundle();
CustomFragment actionBarFragment = getActionBarFragment();
CustomFragment contentFragment   = getContentFragment();
actionBarFragment.setArguments(bundle);
contentFragment.setArguments(bundle);

FragmentTransaction mTransaction = getSupportFragmentManager().beginTransaction();
mTransaction.add(R.id.actionBarPane, actionBarFragment);
mTransaction.add(R.id.contentPane,   contentFragment);
mTransaction.commit();

getSupportFragmentManager().putFragment(bundle, "ContentFragment", contentFragment);
getSupportFragmentManager().putFragment(bundle, "ActionBar", actionBarFragment);
11-20 13:44:17.842: E/Default Exception Handler(12466): Caused by: java.lang.IllegalStateException: Fragment CustomFragment{4219bdb8 id=0x7f06002e com.test.CustomFragment1} is not currently in the FragmentManager
我使用上述函数的原因是,ContentFragment和ActionBar fragment都可以使用
getArguments()
的结果来查找相反的数字,即使它们当前不在backbackback的顶部,例如它们被堆栈中较高的透明片段部分遮挡

但是,我有一个例外:

Bundle bundle = new Bundle();
CustomFragment actionBarFragment = getActionBarFragment();
CustomFragment contentFragment   = getContentFragment();
actionBarFragment.setArguments(bundle);
contentFragment.setArguments(bundle);

FragmentTransaction mTransaction = getSupportFragmentManager().beginTransaction();
mTransaction.add(R.id.actionBarPane, actionBarFragment);
mTransaction.add(R.id.contentPane,   contentFragment);
mTransaction.commit();

getSupportFragmentManager().putFragment(bundle, "ContentFragment", contentFragment);
getSupportFragmentManager().putFragment(bundle, "ActionBar", actionBarFragment);
11-20 13:44:17.842: E/Default Exception Handler(12466): Caused by: java.lang.IllegalStateException: Fragment CustomFragment{4219bdb8 id=0x7f06002e com.test.CustomFragment1} is not currently in the FragmentManager
我是否可以由此得出结论,
commit()
只是将事务放在一个堆栈上,以便在UI线程上完成,
putFragment()
调用在执行该事务之前发生?还是我误解了什么?(Android站点上的文档没有说明片段应该处于的先决条件状态)

值得注意的是
commit()
中的文本,这就是为什么我认为调用发生得太早的原因-一个可能的答案是如何将侦听器附加到事务,以便在事务被
commit()
ed时通知您。我只是认为这不存在

安排此事务的提交。犯罪不会立即发生;它将被安排为下一次线程准备就绪时在主线程上完成的工作

编辑

通过使用糟糕的解决方案,确认问题出在
commit()

mTransaction.commit();
new Thread() {
    public void run() {
        while(!contentFragment.isAdded()) {
            try {
                Thread.sleep(100);
            } catch (Exception e) {}
        }
        getSupportFragmentManager().putFragment(bundle, "ContentFragment", contentFragment);
        getSupportFragmentManager().putFragment(bundle, "ActionBar", actionBarFragment);
    };
}.start();

真正的解决方案仍然非常受欢迎。

我自己从未使用过,但你看过吗?以下是文档中的内容:

在使用提交碎片事务之后 FragmentTransaction.commit(),已计划执行它 在进程的主线程上异步执行。如果你想 立即执行任何此类挂起的操作,您可以调用 函数(仅从主线程)执行此操作。请注意,所有回调 其他相关行为将在此调用中执行,因此 注意这是从哪里来的


听起来它与您的用例相匹配。

您正在将同一个捆绑包实例传递给两个单独的片段?是的。我已经做了一段时间了。据我所知,捆绑包没有工作部件,它们只是一个可序列化的数据集合,没有任何技术理由不这样做,只要您的体系结构意识到它可以被另一个片段的值填充。太棒了,这正是我所需要的。不知道我在上下查看文档时怎么会错过这一点。:)这发生在我们当中最好的人身上。