正文
如要管理 Activity 中的Fragment,需使用 FragmentManager
。如要获取它,请在Activity 调用 getSupportFragmentManager()
。
使用 FragmentManager
可执行的操作包括:
通过
findFragmentById()
(针对在 Activity 布局中提供界面的Fragment)或findFragmentByTag()
(针对提供或不提供界面的Fragment)获取 Activity 中存在的Fragment。通过
popBackStack()
(模拟用户发出的返回命令)使Fragment从返回栈中弹出。通过
addOnBackStackChangedListener()
注册侦听返回栈变化的侦听器。
如上文所述,也可使用 FragmentManager
打开一个 FragmentTransaction
,通过它来执行某些事务,如添加和移除Fragment。
在 Activity 中使用Fragment的一大优点是,可以通过Fragment执行添加、移除、替换以及其他操作,从而响应用户交互。
提交给 Activity 的每组更改均称为事务,并且可使用 FragmentTransaction
中的 API 来执行这些事务。也可将每个事务保存到由 Activity 管理的返回栈内,从而让用户能够回退Fragment更改(类似于回退 Activity)。
如下所示,我们可以从 FragmentManager
获取一个 FragmentTransaction
实例:
FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每个事务都是我们想要同时执行的一组更改。我们可以使用 add()
、remove()
和 replace()
等方法,为给定事务设置想要执行的所有更改。然后将事务应用到 Activity,最后必须调用 commit()
。
不过,在调用 commit()
之前,我们需要调用 addToBackStack()
,以将事务添加到Fragment事务返回栈。该返回栈由 Activity 管理,允许用户通过按返回按钮返回上一Fragment状态。
例如,以下示例说明如何将一个Fragment替换为另一个Fragment,以及如何在返回栈中保留先前的状态:
// Create new fragment and transactionFragment newFragment = new ExampleFragment();FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();// Replace whatever is in the fragment_container view with this fragment,// and add the transaction to the back stacktransaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null);// Commit the transactiontransaction.commit();
在本例中,newFragment
会替换目前在 R.id.fragment_container
ID 所标识的布局容器中的任何Fragment(如果有的话)。通过调用 addToBackStack()
可以将替换事务保存到返回栈,以便用户能够通过按返回按钮撤消事务并回退到上一Fragment。
然后,FragmentActivity
会自动通过 onBackPressed()
从返回栈检索Fragment。
如果您向事务添加多个更改(如有一个 add()
或 remove()
),并调用 addToBackStack()
,则调用 commit()
前应用的所有更改都将作为单一事务添加到返回栈,并且返回按钮会将它们一并撤消。
向 FragmentTransaction
添加更改的顺序无关紧要,不过以下两点需要注意:
最后必须调用
commit()
。如果要向同一容器添加多个Fragment,则添加Fragment的顺序将决定它们在视图层次结构中出现的顺序。
如果没有在执行删除Fragment的事务时调用 addToBackStack()
,则事务提交时该Fragment会被销毁,用户将无法回退到该Fragment。不过,如果在删除Fragment时调用 addToBackStack()
,则系统会停止该Fragment,并随后在用户回退时将其恢复。
提示:对于每个Fragment事务,都可通过在提交前调用 setTransition()
来应用过渡动画。
调用 commit()
不会立即执行事务,而是在 Activity 的界面线程(“主”线程)可执行该操作时,再安排该事务在线程上运行。不过,如有必要,也可以在界面线程直接调用 executePendingTransactions()
,以立即执行 commit()
提交的事务。通常不会这样做,除非其他线程中的作业依赖该事务。
注意:只能在 Activity 保存其状态(当用户离开 Activity)之前使用 commit()
提交事务。如果您试图在该时间点后提交,则会引发异常。这是因为如需恢复 Activity,则提交后的状态可能会丢失。
本节先介绍到这里,下节我们继续讨论Fragment是怎么与Activity通信以及使用Fragment创建菜单项。有问题欢迎关注“计算机自学平台”并留言讨论哦。