Android应用开发过程中,ViewPager同时加载多个fragment,以实现多tab页面快速切换, 但是fragment初始化时若加载的内容较多,就可能导致整个应用启动速度缓慢,影响用户体验。
为了提高用户体验,我们会使用一些懒加载方案,实现加载延迟。这时我们会用到getUserVisibleHint()与setUserVisibleHint()这两个方法
在传统的fragment生命周期里也看不到这个函数。
fragment是如何知道自己时候用户可见?
setUserVisibleHint() 在上图所示fragment的生命周期的什么位置?
先说结论,
viewpager监听切换tab事件,tab切换一次,执行一次setUserVisibleHint()方法
setUserVisibleHint() 在 上图所示fragment所有生命周期之前,无论viewpager是在activity哪个生命周期里初始化。
activity生命周期 和 fragment生命周期 时序并不是按序来的,也就是说fragment的oncreate方法时序并不一定在activity的oncreate方法之后。
执行setAdapter的时候,会调用setUserVisibleHint()方法,并且,只有当setAdapter方法执行完之后,才会进入到Fragment到生命周期,因此setUserVisibleHint()方法在所有生命周期之前被调用。
很多情况下,
fragment
的生命周期上限应该低于
Fragment
Manager/Activity。例如,ViewPager 屏幕外的界面不应被 resumed理想状态下,可以通过以...
判断当前
Fragment
是否可见public abstract class Base
Fragment
extends
Fragment
{/**
Fragment
当前状态是否可见*/protectedboolean isVisible;@Overridepublic void
set
U
serVi
sibleH
int
(boolean isVisibleToUser) {super.
set
U
serVi
si...
public void
set
U
serVi
sibleH
int
(boolean isVisibleToUser) {
super.
set
U
serVi
sibleH
int
(isVisibleToUser);
if (isVisibleToUser) {
//可见时加载数据相当于
Fragment
的onResume
}else{
//不可见是不加载数据
由于
set
U
serVi
sibl
ViewPager同时加载多个
fragment
,以实现多tab页面快速切换, 但是
fragment
初始化时就会预加载后面的页面,为了提高用户体验,实现加载延迟。这时我们会用到getU
serVi
sibleH
int
()与
set
U
serVi
sibleH
int
()这两个方法。
当
fragment
被用户可见时,
set
U
serVi
sibleH
int
()会调用且传入true值,当
fragment
不被用户可见时...
ViewPagerIndicator源码解读1.TabMainActivity最先执行,而且在Adapter里new了FirstLayer
Fragment
因为FirstLayer
Fragment
继承Lazy
Fragment
,Lazy
Fragment
继承Base
Fragment
,Base
Fragment
继承
Fragment
,现在继续看执行哪里2.主要是区分
set
U
serVi
sibleH
int
和onCr
当viewPaper初始化完成以后,执行viewPaper.
set
Adapter()的时候就会执行
set
U
serVi
sibleH
int
(),待
set
Adapter()执行完成以后,才会进入
fragment
的生命周期。我们在调用
set
U
serVi
sibleH
int
()时加载数据时,一般都会调用getU
serVi
sibleH
int
()获取当前
fragment
是否可见,只有当
fragment
为可见状态时(getU
serVi
sibleH
int
()返回值为ture),才会加载数据。
2.如果是在viewpager里,就需要判断getU
serVi
sibleH
int
,不在viewpager时,getU
serVi
sibleH
int
默认为true // 如果是其它情况,就通过isHidden判断,因为show/hide时会改变isHidden的状态
3.当使用show/hide方法时,会调用 onHiddenChanged
Android
应用
开发过程中,ViewPager同时加载多个
fragment
,以实现多tab页面快速切换, 但是
fragment
初始化时若加载的内容较多,就可能导致整个
应用
启动速度缓慢,影响用户体验。
为了提高用户体验,我们会使用”懒加载”方案,实现分批加载。
那么,
set
U
serVi
sibleH
int
什么时候调用呢
现在越来越多的
应用
会使用viewpager+
fragment
显示自己的内容页,
fragment
和activity有很多共同点,如下图就是
fragment
的生命周期
但是
fragment
和activity不同的是当调用本身的onResume和onPause方法的时候可能并不是当前的
fragment
在显示,例如当加载下面这张图时,当我打开MainActivity时显示的是第一个
fragment
但此
我们在做
应用
开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个
Fragment
来组合使用,而如果每个
fragment
都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源。这样的结果,我们当然不会满意。那么,能不能做到当切换到这个
fragment
的时候,它才去初始化呢?答案就在
Fragment
里的
set
UserV...
我们在做
应用
开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个
Fragment
来组合使用,而如果每个
fragment
都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源。这样的结果,我们当然不会满意。那么,能不能做到当切换到这个
fragment
的时候,它才去初始化呢?
注释:
set
U
serVi
sibleH
in
fragment
大家经常
应用
到 声明周期依赖于宿主activity1 第一种用法:切换
fragment
/**使用replace方法 */ private void showMy
Fragment
(
Fragment
fragment
) {
Fragment
Transaction transaction =
fragment
Manager.beg
inT
ransaction(...
在viewpager +
fragment
联合使用时,利用
set
U
serVi
sibleH
int
进行懒加载时,发现并不适用于view的操作。。。因为
set
U
serVi
sibleH
int
是早于oncreateview之前执行的,所以会报空指针,用一段代码演示一下
@Override
public void
set
U
serVi
sibleH
int
(boolean isVisible
2017-1-11日更新:
set
U
serVi
sibleH
int
中过滤父
Fragment
未显示的情况
上一篇【
Android
】友盟统计
Fragment
页面显示隐藏的完美解决方案 我们讲了通过
Fragment
的mU
serVi
sibleH
int
属性可以准确的监听
Fragment
在ViewPager中的显示与隐藏
现在新的问题又来了,当ViewPager嵌套ViewPager的时候子ViewP
在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+
Fragment
,但是
Fragment
有个不好或者太好的地方。例如你在ViewPager中添加了三个
Fragment
,当加载ViewPager中第一个
Fragment
时,它会默认帮你预先加载了第二个
Fragment
,当你加载第二个
Fragment
时,它会帮你加载第三个
Fragment
。这样虽然有时很好,但是用户只需看一个Fr