FragmentTransition replace add show hide方法的使用和差异

android项目,使用Fragment来展示视图,替换Activity显示,能有效的提高响应的速度。结合在项目中的实践,接下来说说我对这些方法的使用感悟。

replace使用

使用replace()替换后会将之前的fragment的view从viewtree中删除
触发顺序:
detach()->onPause()->onStop()->onDestroyView()

attach()->onCreateView()->onActivityCreated()->onStart()->onResume()

使用该方法,每次都可以走一遍生命周期方法,让对象保持在最新的状态,同时也会带来频繁的数据请求,实例销毁和创建。

replace时,通过FragmentTransition的addToBackStack(String name)方法,把被置换的fragment压入任务栈,放在新的fragment下。在replace时如果带上tag参数,那么就可以通过FragmentManager的findFragmentByTag()找到被置换的fragment对象。

这样,当按返回键时,被置换的Fragment就能重新显示出来,并执行对应的生命周期方法(如上显示的触发顺序)。

add使用

使用该方法,常和show和hide配合,达到replace方法的显示效果。
在使用过程中,有时候会出现视图重叠。原因有两种:

  • 没有使用FrameLayout作为容器
  • 第一次add把Fragment添加到容器后,第二次通过FragmentManager.findFragmentByTag(“fragment” + position)找到Fragment而不是重新新建实例add进容器

一个MainActivity加上多个Fragment来构建android项目界面主体。用这种方式,底部每一个菜单就是一个fragment,暂且叫它一级操作界面,通常用add-show -hide方式显示Fragment,在每一个Tab里(二级以上操作界面),通过replace不同的fragment来展示不同的视图。

使用这种方式,我在项目中遇到了一个问题。如果二级操作界面进入到三级操作界面,再从三级操作界面返回到二级操作界面,那么这时候在一级操作界面里,调用了二级操作界面的对象的成员对象将变成null。

原来,当二级操作界面进入到三级操作界面,再从三级操作界面返回到二级操作界面,二级以上的界面通过replace来显示不同的界面,这时候二级操作界面的fragment将按上面的触发顺序重新走一遍生命周期方法,创建了新的实例,原来在一级目录里引用的二级界面上的Fragment的成员对象依然是旧实例里的。

因此这时候解决的办法可以,在每次创建二级界面的fragment实例时,重新更新一遍(set方法)一级界面会用到的所有涉及二级界面fragment的成员变量。

回答: 当我们使用replace方法切换Fragment时,实际上是将之前的Fragment移除并添加一个新的Fragment。\[2\]这意味着之前的Fragment会被销毁,然后新的Fragment会被创建并添加到FragmentLayout中。\[2\]这种方式简单直接,但每次切换都需要销毁之前的Fragment,因此切换耗时相对较长。\[3\]另一种方式是使用add和remove方法来切换Fragment。\[2\]这种方式代码相对复杂,但不需要销毁之前的Fragment,因此切换耗时相对较短。然而,由于没有销毁Fragment,会占用更多的内存。\[3\]所以,选择使用replace还是add和remove取决于你对切换速度和内存占用的权衡。 #### 引用[.reference_title] - *1* *2* [Fragment切换replaceadd,remove,hidden](https://blog.csdn.net/xxx_19942/article/details/106947822)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Fragment切换replace和(add-hide-show)](https://blog.csdn.net/ahou2468/article/details/111504116)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值