-
简书
-
CSDN
Fragment(四)常见问题
通过这篇博客,我们能知道以下问题:
Fragment在不同情况下实现网络延迟Fragment为什么一定要有无参构造?Fragment与Activity传递数据方式- 嵌套
Fragment时父Fragment生命周期传递到子Fragment中的方式
1. Fragment 在不同情况下实现网络延迟
其实使用延迟加载主要目的是在页面对用户可见时在加载网络,避免资源浪费,那么这个问题就转换成了 Fragment 在不同情况下怎样判断对用户的可见性,这个问题在前面的几篇博客中都或多或少的提到了,这里直接做一个总结:
-
add()+show()/hide():生命周期方法不对,多个添加的Fragment一开始就会会同时执行到onResume(),退出时又会同时执行其他生命周期方法(onPause()到onDetach()),所以不能直接通过生命周期方法处理,而是需要通过onHiddenChanged(boolean hidden)方法判断。 -
replace():“替换”,这种方式会销毁布局容器内的已有Fragment,然后重新创建一个新的Fragment,销毁的Fragment执行onPause()到onDetach()回调方法,新的Fragment会执行onAttach()到onResume()回调,所以直接在onStart()或onResume()回调中处理就行了。 -
ViewPager:在AndroidX之前只有一种情况,在AndroidX中有两种情况,在Adapter构造中增加了一个behavior参数(取值:BEHAVIOR_SET_USER_VISIBLE_HINT、BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT),非AndroidX就相当于取值BEHAVIOR_SET_USER_VISIBLE_HINT,所以两种情况需要分别来看:-
BEHAVIOR_SET_USER_VISIBLE_HINT:生命周期方法监听不准确,需要通过setUserVisibleHint()方法来监听,当方法传入值为true的时候,说明Fragment可见,为false的时候说明Fragment被切走了。但是需要注意的是,这个方法不属于生命周期方法,所以它可能在生命周期方法执行之前就执行了,也就是说,有可能执行这个方法的时候,Fragment还没有被添加到容器中,所以需要进行判断一下。 -
BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT:生命周期方法是正常的,只有正在显示的Fragment执行到onResume()方法,其他Fragment只会执行到onStart()方法,并且当Fragment切换到显示时执行onResume()方法,切换到不显示状态时触发onPause()方法。
-
-
ViewPager2:生命周期方法也是正常的,只有正在显示的Fragment执行到onResume()方法,其他Fragment只会执行到onStart()方法,并且当Fragment切换到显示时执行onResume()方法,切换

本文详细探讨了Fragment的常见问题,包括如何在不同场景下实现网络延迟加载,理解为何Fragment必须有无参构造,Fragment间的数据传递方法,以及在Fragment嵌套时如何处理父Fragment生命周期传递给子Fragment。文章提供了具体的解决方案和示例代码,旨在帮助开发者更好地掌握Fragment的使用技巧。
最低0.47元/天 解锁文章
5814

被折叠的 条评论
为什么被折叠?



