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的成员变量