【问题标题】:Android FragmentTransaction commit When?Android FragmentTransaction 何时提交?
【发布时间】: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() 已提交事务,以便我可以对添加的片段进行一些工作?此外,有什么方法可以等到提交发生,然后继续执行其余代码?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    在提交您的事务之后但在通过标签查找之前尝试运行fragmentManager.executePendingTransactions(),看看这是否适合您。

    【讨论】:

    • 嘿,马克!你猜怎么着!这是工作。现在我有另一个问题要问你,你能告诉我为什么我阅读了 3 到 4 次 FragmentTransaction 的文档以找到解决方案,但我从未看过 FragmentManager 的文档吗? :-)
    • 我很高兴这有效。文档可能会更具凝聚力和直观性......
    【解决方案2】:

    在 Android API 24 中,FragmentTransaction 具有同步的 .commitNow() 方法。 现在在参考中:https://developer.android.com/reference/android/app/FragmentTransaction.html#commitNow()

    相反,.commit() 异步工作。它只是安排事务的提交。

    【讨论】:

    【解决方案3】:

    我也遇到了类似的问题。

    我认为这里的关键学习是使用 commitNow() 而不是 commit() 和 getSupportFragmentManager。这将禁止主线程执行,直到片段被销毁。在构建接口和使用共享活动时必须这样做。我应该知道这让我难过了一阵子!

    这是一个示例代码示例: getSupportFragmentManager().beginTransaction().remove(getSupportFragmentManager().findFragmentById(R.id.fragment_frame)).commitNow();

    【讨论】:

      【解决方案4】:

      "....所以我可以对添加的片段做一些工作?此外,有什么方法可以等到提交发生并然后继续执行其余代码?”

      这完全取决于你想做什么工作。从您的问题中,我看到您的大部分工作代码无论如何都应该在您的片段代码中,例如在选择库存项目时。

      在选择列表项时的回调(为了更改详细信息片段)无论如何,您都可以轻松地掌握详细信息片段。

      此外,您已经拥有来自FragmentsPool.getHelperFileFragment(501), 返回的片段,所以我不明白您为什么需要通过其标签获取片段。

      我很想知道您需要在onCreate 中使用您添加的详细信息片段进行哪些工作。

      【讨论】:

      • 首先感谢您的回答。实际上大部分工作都是在活动代码中完成的(新记录、保存、删除等)。您建议的方法非常正确,但我的应用程序有点复杂,我想要通过标签的详细信息片段的原因是因为有时我需要知道在使用 FragmentsPool.getHelperFileFragment 更改为新的之前显示的最后一个详细信息片段() 以创建后台堆栈。在 onCreate 中,我只是根据一个 ListID 初始化活动的第一个“外观”。我的问题中的代码被简化且不完整
      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      相关资源
      最近更新 更多