一、添加fragment和删除fragment
- add:添加一个fragment到fragment manager。
- remove:从fragment manager中删除一个fragment。
- replace:替换fragment manager中的fragment。等同于先remove旧的fragment,然后add新的fragment。
当我们使用这几个操作的时候,还有一些细节需要了解。首先说明下操作参数。
- containerViewId:fragment创建的view会被添加到这个id代表的container中。查找container id的范围是由fragment manager的host决定的。activity 的fragment manager从activity的root view查找。fragment 的child fragment manager从fragment的root view查找。
- tag:为fragment指定一个标记,主要用于fragment的查询。这个标记可以不唯一,如果不唯一,那么在查询时返回的是具有相同标记并且后添加的fragment。
二、隐藏fragment和显示fragment
隐藏显示操作的本质是控制fragment 的root view隐藏或显示,所以它的控制是基于fragment已经添加到view 。用户可以调用fragment.isHidden()判断当前的显示状态,同时也可以通过覆写fragment的onHiddenChanged(boolean hidden)监听显示状态的变化。
- show:设置fragment显示。fragment必须已经添加到fragment manager并且他被隐藏。
- hide:设置fragment隐藏。。fragment必须已经添加到fragment manager。
三、fragment manager的回退栈管理
fragment manager的回退栈是通过操作压栈的方式实现的,当需要退栈时, fragment manager便进行操作回滚。用户可以通过下面方法进行操作栈管理:
- addToBackStack(@Nullable String name) name用于标记当前的操作。如果用户将操作压栈,那么调用commit()后会返回一个当前操作的唯一id标识。用户通过name标识或id标识都可以在操作栈中查找到操作。
- popBackStack(@Nullable String name, int flags);通过指定name标识进行操作退栈,如果指定的name标识不是唯一的,那么会从操作栈的根部开始匹配。
- popBackStack(int id, int flags);通过指定id标识进行操作退栈,id标识是系统生成的,所以必然是唯一的。
- 被记录在操作栈中的fragment被用户通过非退栈的方式移除,比如调用remove方法移除。栈回滚是任然算一个状态,也就是说虽然用户看不到被移除的fragment,但他还是占用了一步回退操作。
- child fragment manager会单独的进行操作栈维护,不会被parent fragment manager识别,也就不被他管理。
四、Fragment查找
- findFragmentByTag(@Nullable String tag)可以通过指定tag来查找。
- findFragmentById(@IdRes int id);可以通过指定fragmentId来查找。fragmentId就是添加fragment时指定的containerId。
- tag/fragment查找的顺序与添加顺序相反,也就是说在tag/fragment相同的fragment中后添加的会被先查找到。
五、重建fragment问题
- configuration(切换语言、转屏) 变化时系统自动重建fragment,系统重建fragment时使用的是无惨构造函数。如果用户生成fragment时使用的是有参构造函数,那么这个参数在重建的fragment中无效。所以按照官方建议不要使用构造函数传参,而是要使用argument的方式传参数。因为在重建fragment时,argument可以被系统恢复。
我的公众号已经开通,公众号会同步发布。
欢迎关注我的公众号