我正在构建一个平板电脑应用。在这个应用程序中,有一个活动有两个片段。第一个片段是“已知”列表片段,它显示来自数据库查询的简单的一个项目布局列表,第二个片段显示有关所选记录的详细信息(来自列表片段)。第二个片段的思考是它的类型取决于列表中显示的记录。例如,如果记录是客户,则显示所选客户的详细信息,如果它们是库存项目,则显示所选项目的详细信息等。 为了与Details Fragment进行通信,我创建了一个每个细节片段类都实现的接口。 列表片段在布局xml的活动中“固定”。然而,细节片段是在活动创建过程中创建的,如下所示:
super.onCreate(savedInstanceState);
setContentView(R.layout.act_hlpfiles_host);
...
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.laydetailsfragment, FragmentsPool.getHelperFileFragment(501), "recordDetails");
fragmentTransaction.commit();
myDetailsFragment = getFragmentManager().findFragmentByTag("recordDetails");
...
myListFragment = (frg_hlpfiles_lstrecords) getFragmentManager().findFragmentById(R.id.frg_lstrecords);
....
}
此代码的问题是myDetailsFragment始终为null。这是因为fragmentTransaction.commit()不会立即运行,但它会在下一次线程准备就绪时发生在主线程上(如android文档所述)。
如果我在onStart()中创建详细信息片段并在onCreate中实例化列表片段,一切正常。
所以问题是:我如何确定fragmentTransaction.commit()已提交事务,以便我可以使用添加的片段进行一些工作?还有什么方法可以等到提交发生,然后继续使用剩下的代码?
答案 0 :(得分:104)
尝试在提交交易之后但在通过标记查找之前运行fragmentManager.executePendingTransactions()
,看看它是否适合您。
答案 1 :(得分:7)
在Android API中,.commitNow()
具有同步.commit()
方法。
它现在在参考中:https://developer.android.com/reference/android/app/FragmentTransaction.html#commitNow()
相反,hover
异步工作。它只是安排事务的提交。
答案 2 :(得分:0)
“.... 所以我可以使用添加的片段做一些工作?还有什么方法可以等到提交发生,然后继续其余的代码< /强>?“
这完全取决于你想做什么工作。根据您的问题,我发现大多数工作代码都应该在您的片段代码中,例如选择了库存项目时。
在选择了选择列表项目的回调中(为了更改细节片段),无论如何,您都能够轻松掌握细节片段。
此外,您已经拥有FragmentsPool.getHelperFileFragment(501),
返回的片段,因此我不明白为什么您需要通过其标记获取片段。
我很想知道您需要在onCreate
中使用添加的详细信息片段完成哪些工作。
答案 3 :(得分:0)
我正面临类似的问题。
我认为这里的主要学习方法是使用commitNow()代替getSupportFragmentManager的commit()。这将禁止主线程执行,直到片段被销毁为止。建立界面和使用共享活动时,这势在必行。我应该知道这让我难过了一段时间!
这是示例代码示例: getSupportFragmentManager()。beginTransaction()。remove(getSupportFragmentManager()。findFragmentById(R.id.fragment_frame))。commitNow();