天天看点

FragmentManager与FragmentTransactioin

FragmentManager为Fragment的管理类:

FragmentManager能够实现管理activity中fragment.

通过调用activity的getFragmentManager()或者getSupportFragmentManager()取得它的实例

FragmentManager可以做如下一些事情:

1、使用findFragmentById() (用于在activity layout中提供一个UI的fragment)或findFragmentByTag()(适用于有或没有UI的fragment)

获取activity中存在的fragment,但是在fragmentTransaction将新的add的fragment操作提交前,且提交后不会立刻生效,是不能通过

FragmentManager的find功能函数去找到目标fragment的,因为还没加进去。

2、将fragment从后台堆栈中弹出, 使用 popBackStack() (模拟用户按下BACK 命令).

3、使用addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener.

FragmentTransaction:

FragmentTransaction对fragment进行添加,移除,替换,以及执行其他动作。

获取FragmentTransaction实例:

FragmentManager fragmentManager = getFragmentManager();

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

在调用commit()之前, 你可能想调用 addToBackStack(),

将事务添加到一个fragment事务的back stack.

这个back stack由activity管理, 并允许用户通过按下 BACK 按键返回到前一个fragment状态.

调用 commit() 并不立即执行事务.

恰恰相反, 它将事务安排排期, 一旦准备好, 就在activity的UI线程上运行(主线程).

如果有必要,你可以从你的UI线程调用 executePendingTransactions() 来立即执行由commit()提交的事务.

但这么做通常不必要, 除非事务是其他线程中的job的一个从属.

注意:

当前的fragment崩溃消除后,程序回读取savedInstanseState中存储的数据,

所以,当你调用FragmentTransaction的hide(),show()方法时,导致没有效果。

来回调用show(),hide()方法,很容易导致fragment崩溃,需要重写空的FragmentActivity的onSaveInstansceState()方法即可,

或者调用commitAllowingStateLoss方法,直接跳过读取activity

的saveInstansceState这一过程都行。

还有一种很粗暴的的执行办法:

直接通过FragmentManager.beginTransaction创建一个新的执行实例对fragment集合进行新的操作,隐患是消耗一定量的内存,且

不稳定,不能判断丢失掉的saveINstatnceState何时造成影响