FragmentManager 和 FragmentTransaction 到底是做啥的?

Posted

技术标签:

【中文标题】FragmentManager 和 FragmentTransaction 到底是做啥的?【英文标题】:What does FragmentManager and FragmentTransaction exactly do?FragmentManager 和 FragmentTransaction 到底是做什么的? 【发布时间】:2015-06-29 05:45:29 【问题描述】:

下面有简单的代码

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mFeedFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

这些代码行做什么?

【问题讨论】:

我很惊讶你得到了答案。据我所知,下面的解释远远不能真正解释这个两步过程。 【参考方案1】:
getFragmentManager()

返回 FragmentManager 用于与关联的 Fragment 进行交互 与此活动。

FragmentManager,用于创建添加、删除或替换片段的事务。

fragmentManager.beginTransaction();

对关联的 Fragments 启动一系列编辑操作 这个 FragmentManager。

将使用的 FragmentTransaction 对象。

fragmentTransaction.replace(R.id.fragment_container, mFeedFragment);

将当前片段替换为布局上的mFeedFragment,id 为:R.id.fragment_container

fragmentTransaction.addToBackStack(null);

将此事务添加到后台堆栈。这意味着 事务提交后会被记住,并会反转 之后从堆栈中弹出时的操作。

对于返回按钮的使用很有用,因此可以回滚事务。 参数名称:

是此返回堆栈状态的可选名称,或者为 null。

查看其他问题What is the meaning of addToBackStack with null parameter?获取信息

Last 语句提交事务并执行所有命令。

查看谷歌文档以获得更多帮助:

http://developer.android.com/reference/android/support/v4/app/FragmentActivity.html http://developer.android.com/reference/android/app/FragmentManager.html http://developer.android.com/reference/android/app/FragmentTransaction.html

【讨论】:

你能告诉我一些使用片段的重要应用程序吗?真的有用吗? 是的,因为每个使用抽屉式导航的应用程序都使用片段。 developer.android.com/design/patterns/navigation-drawer.htmldeveloper.android.com/training/implementing-navigation/…【参考方案2】:

安卓FragmentManager

FragmentManager 在 Android 中管理 Fragments,特别是它处理片段之间的事务。事务是一种添加、替换或删除片段的方法。

安卓FragmentTransaction

如前所述,FragmentTransaction 为我们提供了在 Android 中添加、替换或删除片段的方法。它为我们提供了一个与片段交互的接口。


fragmentTransaction.replace(R.id.fragment_container, mFeedFragment);

方法replace(int containerViewId, Fragment fragment) 替换容器containerViewId 中的现有Fragment 对象并添加Fragment fragment

fragmentTransaction.addToBackStack(null);

addToBackOfStack(String name)这个方法将此事务添加到后台堆栈中,可以使用它以便Fragments被记住并可以被Activity再次使用

fragmentTransaction.commit();

方法commit() 调度这个事务,这不是瞬时的;它被安排在主线程上,以便在线程准备好时完成。

Reference

【讨论】:

是的,我们都知道这些类的作用,但是为什么呢?为什么要单独上课?为什么 FragmentManager 不能完成 FragmentTransaction 的工作? @ScottBiggs 感谢您的提问。我仔细研究了这些类,我相信这是一个分离相似功能的问题; FragmentTransacion 处理与“事务”有关的特定事情,例如动画和面包屑。我的另一个想法是,随着 Android 功能的发展,这将主要有助于未来的发展。我注意到你很合格,不知道你的意见是什么? 您可能是对的,但我们正在尝试解读 Google UI 程序员的想法,这非常困难。 Android 编程一开始非常困难,并且随着每个新版本的增加而变得复杂。在这一点上,我只想要简单,即使这意味着不再向后兼容。 @ScottBiggs,FragmentTransaction 和 FragmentManager 逻辑可能在不同的类中实现的另一个原因:在developer.android.com/reference/android/app/… 中,文档讨论了面包屑标题被修改为“当事务在后台堆栈时” .我可能在此处的左侧字段中,但由于返回堆栈,分离事务逻辑对我来说是有意义的。 ? @CharlesThomas 非常有趣的理论。但是由于 FragmentBreadCrumbs 已被弃用,我有点怀疑这是全部原因。可能确实有一些关于如何处理后堆栈的问题。如果您发现更多,请再次发表评论。

以上是关于FragmentManager 和 FragmentTransaction 到底是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

Fragmen直接来回切换deno

FragmentManager 和 FragmentTransaction 到底是做啥的?

android.support.v4.app.FragmentManager 还是 android.app.FragmentManager?

安卓开发之Activity传输数据到Fragmen+实例分析

FragmentManager和FragmentTransaction到底做了什么?

在 DialogFragment 中使用 FragmentManager 和 FragmentTransaction