Android 关于Fragment 状态与生命周期的关系

用于备忘记录:

1. FragmentTransaction对于Fragment的show与hide不会触发任何Fragment的生命周期,只是单纯的将Fragment的View隐藏与显示。暂时没有找到方便的监控方法。但是通过Fragment的isVisible与isHidden可以判断该Fragment当前处于什么状态。

2. Attach与detach方法会触发Fragment的onCreateView与onDestroyView的生命周期,同时使用Fragment中的rootView(onCreateView创建的view)的addOnAttachStateChangeListener方法也可以监听该状态的变化。但是attach与detach是不会触发onAttach与onDetach的。这点也是比较奇怪。同时,使用Fragment的isAdded与isDetached是可以判断这种状态

     重复的单独调用Attach或者detach方法并不会有任何反应。但是如果是两个方法同时调用则会导致Fragment的onCreateView与onDestroyView被调用。比如当前是added状态(已经attach),若同时调用detach与attach(最后统一commit提交)。页面上不会看到变化,因为执行后仍然是added状态,但是执行时Fragment会先执行onDestroyView然后又立刻onCreateView。结论:FragmentTransaction 的请求 commit后会将你的所有要求的所有请求顺序执行一遍,不会合并。但是如当前状态与提交的请求相同则不会有变话。(即当前未Added状态,再次提交attach请求,则不会有变化) 。所以在可以避免的情况下不要同时调用两个方法。

3.add与remove方法是Fragment的添加的根方法。会触发所有的生命周期。根据刚刚说的FragmentTransaction commit原理。add与remove同时调用也会导致Fragment刷新一遍生命周期造成不必要的开销,所以不要同时调用。

   replace意为替换,所以这个方法会替换掉位于最前方的Fragment(即最先加入进来的Fragment)。但是这个替换不包括顺序。例如:FragmentA加入(当前:A),FragmentB加入(当前:AB)FragmentC替换,则A会被remove,C再add(当前:BC)。所以C会排序在B之后。若此时FragmentD发起替换。则B会被remove(CD)。这也是replace后新替换的Fragment会立刻显示出来的原因。

猜你喜欢

转载自liguanyi11111.iteye.com/blog/2212901
今日推荐