FragmentManager与FragmentTransactioin

本文探讨了Android中的FragmentManager和FragmentTransaction的使用。重点介绍了如何通过findFragmentById()和findFragmentByTag()查找Fragment,强调了在FragmentTransaction提交前无法通过FragmentManager找到新添加的Fragment。同时,文章提到了在处理保存状态时可能导致的崩溃问题,建议重写onSaveInstanceState()方法或使用commitAllowingStateLoss()。最后,提到了通过新建事务直接操作Fragment集合的风险和潜在影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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何时造成影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值