【发布时间】:2011-08-30 16:24:08
【问题描述】:
我正在构建一个平板电脑应用。在这个应用程序中,有一个带有两个片段的活动。第一个片段是一个“已知”列表片段,它显示来自数据库查询的简单单项布局列表,第二个片段显示有关所选记录的详细信息(来自列表片段)。第二个片段的想法是它的类型取决于列表中显示的记录。例如,如果记录是客户,则显示所选客户的详细信息,如果它们是库存项目,则显示所选项目的详细信息等。 为了与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 始终为空。这是因为 fragmentTransaction.commit() 不会立即运行,而是在下一次主线程准备好时发生在主线程上(如 android 文档所述)。
如果我在 onStart() 中创建详细信息片段并在 onCreate 中实例化列表片段,一切正常。
所以问题是:如何确定 fragmentTransaction.commit() 已提交事务,以便我可以对添加的片段进行一些工作?此外,有什么方法可以等到提交发生,然后继续执行其余代码?
【问题讨论】: