Android Studio Fragment重叠问题求助:FAB未随Fragment替换消失
兄弟,我之前也踩过类似的坑,给你列几个最可能的排查点,你挨个核对下:
先确认布局层级和容器归属
打开Fragment A的布局文件,仔细看FAB的父容器是不是和RecyclerView同属Fragment A的根布局?有没有可能FAB其实是直接放在Activity的布局里(比如和Fragment容器平级)?如果FAB不属于Fragment A的视图树,那替换Fragment A自然不会影响它。另外,再确认你代码里用来执行replace操作的容器ID,是不是Fragment A被添加的那个父容器(比如Activity里的R.id.fragment_container),而不是Fragment A内部RecyclerView所在的子容器。检查Fragment事务的代码细节
别嫌麻烦,再看一遍导航代码:- 是不是用了
replace()而不是add()?如果是add()的话Fragment A不会被移除,FAB当然会留在上面; - 替换的容器ID是不是写对了?有没有手滑写成RecyclerView的ID或者Fragment A内部的子容器ID?比如本来要替换
R.id.main_container,结果写成了R.id.recycler_holder; - 用的是哪个FragmentManager?如果在Fragment A里调用
getChildFragmentManager()来执行替换,那操作的是Fragment A内部的子Fragment容器,而不是替换Fragment A本身,这时候FAB作为Fragment A的视图自然会保留。
- 是不是用了
排查FAB是否被手动添加到了外部视图层级
有没有在代码里把FAB的父容器改成了Activity的根布局?比如为了处理软键盘或者全局悬浮效果,写了类似((ViewGroup) getActivity().findViewById(android.R.id.content)).addView(fab)这种代码?如果FAB已经脱离了Fragment A的视图树,替换Fragment A当然不会把它带走。确认Fragment的生命周期执行情况
可以在Fragment A的onDestroyView()里打个Log,看看替换操作触发后这个方法有没有被调用。如果没被调用,说明Fragment A根本没被销毁,那FAB肯定会留在界面上——这大概率是因为你替换的不是Fragment A所在的容器,而是它内部的某个子容器。
内容的提问来源于stack exchange,提问作者Xarthez

