相关文章推荐
谦逊的板栗  ·  c++ - In CMake, how ...·  7 月前    · 
谦逊的板栗  ·  jpa repository ...·  11 月前    · 
谦逊的板栗  ·  rowid and rownum in ...·  11 月前    · 
谦逊的板栗  ·  ORA-01654 unable to ...·  11 月前    · 
谦逊的板栗  ·  文件系统 | 微信开放文档·  11 月前    · 
谦逊的板栗  ·  Keeping Web Shells ...·  1 年前    · 
坏坏的麦片  ·  SqlParameter.Value ...·  2 小时前    · 
爱旅游的铁链  ·  Uses of Class ...·  2 小时前    · 
独立的红豆  ·  SqlParameter ...·  2 小时前    · 
聪明伶俐的课本  ·  SpringBoot ...·  4 小时前    · 

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
 
推荐文章