FragmentManager和FragmentTransaction究竟是做什么的?

65

我有下面这段简单的代码

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

这些代码的作用是什么?


1
我很惊讶你选择了一个答案。就我所知,下面的解释远远不能真正解释这个两步过程。 - SMBiggs
3个回答

73
getFragmentManager()

返回与此活动关联的片段交互的FragmentManager。FragmentManager用于创建添加、删除或替换fragment的事务。
fragmentManager.beginTransaction();

开始一系列编辑与此 FragmentManager 相关联的片段操作。
将使用的 FragmentTransaction 对象。
fragmentTransaction.replace(R.id.fragment_container, mFeedFragment);

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

fragmentTransaction.addToBackStack(null);

请将以下内容翻译成中文:

将此事务添加到后退栈。这意味着提交后将记住该事务,并在稍后从堆栈中弹出时撤消其操作。

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

可选的后退栈状态名称,或为null。

有关信息,请参见其他问题 addToBackStack与null参数的含义是什么?

最后一条语句提交事务并执行所有命令。

请参阅Google文档以获取更多帮助:

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


你能告诉我一些使用fragment的重要应用吗?那真的有用吗? - Alireza.Heidari
1
是的,它被使用,因为使用侧边栏导航的每个应用程序都使用片段。https://developer.android.com/design/patterns/navigation-drawer.html https://developer.android.com/training/implementing-navigation/nav-drawer.html - Zelldon

26

Android FragmentManager

FragmentManager 管理 Android 中的Fragments,具体地,它处理片段之间的事务。交易是添加、替换或删除片段的一种方法。

Android FragmentTransaction

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


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()安排执行此事务,这不是即时的;它会在主线程上安排执行,以便在线程准备好时执行。

参考


7
我们都知道这些类是做什么的,但为什么要这样做?为什么要分开这些类?为什么不能让FragmentManager来执行FragmentTransaction的工作? - SMBiggs
2
@ScottBiggs 感谢你的问题。我仔细研究了这些类,我认为这是将类似功能分离的问题;FragmentTransaction 处理与“事务”有关的特定事项,例如动画和面包屑导航。我还想到的另一个想法是,随着 Android 功能的增长,这将主要有助于未来的开发。 我注意到你很有资格,不知道你在这方面有何看法? - Gready
2
你可能是对的,但我们正在试图读懂谷歌UI程序员的心思,这真的很困难。Android编程一开始就非常困难,并且随着每个新版本的推出而变得越来越复杂。目前,我只想要简单性,即使这意味着不再兼容旧版本。 - SMBiggs
1
@ScottBiggs,FragmentTransaction和FragmentManager逻辑可能被实现为不同的类的另一个原因是:在https://developer.android.com/reference/android/app/FragmentTransaction.html#setBreadCrumbShortTitle中,文档提到面包屑标题在“事务位于返回栈上”时会被修改。我可能有些离题了,但对我来说,将事务逻辑与返回栈分开是有道理的。 - Charles Thomas
@CharlesThomas 很有趣的理论。但是由于FragmentBreadCrumbs已被弃用,我有点怀疑这不是全部原因。可能确实与后退栈的处理方式有关。如果您发现更多信息,请再次评论。 - SMBiggs
https://developer.android.com/guide/components/fragments.html 介绍了 Fragment 的模块化特性。我认为 FragmentTransaction 的原因是...如果没有 FragmentTransaction,那么需要一个庞大的 FragmentManager 来处理 fragment 配置的所有可能排列组合。 - Charles Thomas

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接