-
简书
-
优快云
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
切换到显示时执行