前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ViewPager+ Fragment结合的setUserVisibleHint()调用时机

ViewPager+ Fragment结合的setUserVisibleHint()调用时机

作者头像
Android技术干货分享
发布于 2019-06-11 02:32:51
发布于 2019-06-11 02:32:51
1.7K00
代码可运行
举报
文章被收录于专栏:Android技术分享Android技术分享
运行总次数:0
代码可运行

最近的项目使用到了ViewPager + Fragment的模式,要求在每次Fragment获取显示的时候来刷新数据,该项目下ViewPager有5个子fragment,在onCreateView及fragment的setUserVisibleHint(bool isVisibleToUser)中的isVisibleToUser为true的时候刷新数据的时候出现数据多次刷新的情况,因此对ViewPage + Fragment的生命周期做了研究。

项目布局最顶层5个button,主体是ViewPager+fragment, 可以通过点击button直接跳转到对应的fragment,也可以通过左右滑动来进行相邻跳转。

为了研究多个fragment的生命周期,加入打印如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Slog.i("onCreateView 3");
        View view = inflater.inflate(R.layout.my_police_events_fragment, container, false);
        return view;
    }
 
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        Slog.i("setUserVisibleHint 3 " + isVisibleToUser);
        super.setUserVisibleHint(isVisibleToUser);
    }
 
    @Override
    public void onDestroyView() {
        Slog.i("onDestroyView 3 ");
        super.onDestroyView();
    }
1. 第一次进入该activity,fragment1被选中,打印如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
第一次进入
setUserVisibleHint 1 false
setUserVisibleHint 2 false
setUserVisibleHint 1 true
onCreateView 1
onCreateView 2

参数为true

2. 从fragment1切换到fragment2,fragment2被选中,打印如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1--->2
setUserVisibleHint 3 false
setUserVisibleHint 1 false
setUserVisibleHint 2 true
onCreateView 3

创建了fragment3,且fragment2中的setUserVisibleHint参数为true

3.从fragment2切换到fragment3,fragment3被选中,打印如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2--->3
setUserVisibleHint 4 false
setUserVisibleHint 2 false
setUserVisibleHint 3 true
onDestroyView 1 
onCreateView 4

创建了fragment4,销毁了fragment1,且fragment3中的setUserVisibleHint参数为true

4. 后面滑动的过程日志打印如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3--->2
setUserVisibleHint 1 false
setUserVisibleHint 3 false
setUserVisibleHint 2 true
onCreateView 1
onDestroyView 42--->3
setUserVisibleHint 4 false
setUserVisibleHint 2 false
setUserVisibleHint 3 true
onDestroyView 1 
onCreateView 43--->4
setUserVisibleHint 5 false
setUserVisibleHint 3 false
setUserVisibleHint 4 true
onDestroyView 2
onCreateView 54--->5
setUserVisibleHint 4 false
setUserVisibleHint 5 true
onDestroyView 3 

猜测:通过以上日志,可以发现,不论fragment如何变化,首先被选中的fragment会调用参数为true的setUserVisibleHint方法,被选中的fragment与相邻的fragment的状态肯定是onCreate的状态(如果未create就调用onCreateView,如果已经是onCreate的状态不调用),相邻的fragment会调用参数为false的setUserVisibleHint方法,其他的fragment是处于onDestroy的状态。

5. 为了验证我们的猜想,将不再采用相邻滑动的方式,采用button点击跳转的方式来检验fragment的生命周期。相关打印如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
5--->2
setUserVisibleHint 2 false
setUserVisibleHint 1 false
setUserVisibleHint 3 false
setUserVisibleHint 5 false
setUserVisibleHint 2 true
onCreateView 2
onCreateView 1
onCreateView 3
onDestroyView 4 
onDestroyView 52--->4
setUserVisibleHint 4 false
setUserVisibleHint 5 false
setUserVisibleHint 2 false
setUserVisibleHint 4 true
onCreateView 4
onCreateView 5
onDestroyView 2 
onDestroyView 1 

总结:

可以看到,不管fragment如何变化,都是按照上面的规则进行变动的,知道了fragment的生命周期,那么就可以选择在合适的时期对我们的数据进行处理了,避免出现数据未加载或者多次加载的情况了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.06.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Kotlin报错已解决】java.lang.IllegalStateException: Fragment not attached to Activity
在 Android 开发中,Kotlin 语言的使用越来越广泛。然而,开发者们在开发过程中经常会遇到各种报错信息,这些报错可能会让开发进程陷入困境。其中,“java.lang.IllegalStateException: Fragment not attached to Activity”这个报错就是比较常见的一种。它通常会在特定的场景下出现,给开发者带来不少困扰。那么,这个报错到底是怎么产生的呢?又该如何解决呢?让我们一起来深入探讨一下。
鸽芷咕
2025/05/26
650
TabLayout+ViewPager+Fragment实现切页展示「建议收藏」
目前大多数的APP都采用的是几个Tab标签以及多个界面滑动的形式来提供多层次的交互体验,最为常用的做法就是采用TabLayout+ViewPager+Fragment的方式,最近在公司项目中遇到类似的界面,也看了各个论坛很多份博客,但是发现都没有完全把这种方法的坑填完,因此写下这篇博客,一方面是对知识的总结,另一方面也能让其他开发者们少走一些弯路,博客内容主要分为四个章节:
全栈程序员站长
2022/09/15
3.7K0
TabLayout+ViewPager+Fragment实现切页展示「建议收藏」
Android开发之ViewPager+Fragment
使用步骤 1、Activity的布局文件 <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" > </android.support.v4.view.Vie
YungFan
2018/04/24
7390
ViewPager 详解(五)—–使用Fragment实现ViewPager滑动[通俗易懂]
前言:前几篇文章讲解了ViewPager的普通实现方法,但android官方最推荐的一种实现方法却是使用fragment,下面我们使用fragment来重新实现一下第一篇《ViewPager 详解(一)—基本入门》所实现的效果。
全栈程序员站长
2022/09/15
1.8K0
ViewPager 详解(五)—–使用Fragment实现ViewPager滑动[通俗易懂]
Android谈谈封装那些事--BaseActivity和BaseFragment(二)
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/53889223
Hankkin
2018/09/06
2.3K0
《Android基础:Fragment,看这篇就够了》
| 导语 Fragment作为Android最基本,最重要的基础概念之一,在开发中经常会和他打交道。本文从为什么出现Fragment开始,介绍了Fragment相关的方方面面,包括Fragment的基本定义及使用、回退栈的内部实现、Fragment通信、DialogFragment、ViewPager+Fragment的使用、嵌套Fragment、懒加载等。 下文中FragmentDemo的源代码地址:https://github.com/xiazdong/FragmentDemo 基本概念 Fragmen
腾讯Bugly
2018/03/23
4.1K0
Android开发之漫漫长途 XII——Fragment详解
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!
LoveWFan
2018/08/07
4360
Android开发之漫漫长途 XII——Fragment详解
【Android】Fragment懒加载和ViewPager的坑
ANDROID和福利两个Fragment是设置的Fragment可见时加载数据,也就是懒加载。圆形的旋转加载图标只有一个,所以,如果当前Fragment正处于加载状态,在离开该Fragment时需要隐藏加载动画,因为另一个Fragment并不一定处于加载状态,当返回Fragment时,如果还是处于加载状态,则要可以实现自动显示加载动画,如果数据已经加载完毕则不需要再显示出来。
请叫我大苏
2019/02/15
2.1K0
【Android】Fragment懒加载和ViewPager的坑
ViewPager懒加载的实现,理解setUserVisibleHint,而不只是会用就好
Viewpager默认会缓存临近操作的两个页面,也就是至少会缓存一个页面。但我们有时候的需求是需要当滑动到相应页面后再去更新数据,比如网络请求这种,可能你会说,那直接在onResumel里请求数据不就行了,但是ViewPager预加载机制在你处于前一个页面时,已经加载好了下一个页面。当然你也可以将所有页面全部缓存,但这样所消耗的内存不言而喻,而且如果数据过多,第一次进去的时候的速度不可估量。所以这次我们使用懒加载来实现我们的需求。 Fragment 提供了 setUserVisibleHint 方法检测
Petterp
2022/02/09
9650
ViewPager懒加载的实现,理解setUserVisibleHint,而不只是会用就好
android ViewPager+Fragment之懒加载
说说写这篇博客的背景吧,前两天去面试,问到一个问题说的是:比如我们首页,是有3个fragment构成的,并且要是实现作用可以滑,那么这个最好的选择就是ViewPager+fragment了,但是我们知道ViewPager+fragment是做预加载的,然而这种方法有一个坏处,当前页面和预加载页面都有大量的网络请求,可能就会比较慢,这样就会造成不好打体验。其实我们忽略的一个问题,Android的fragment里面已经帮我们提供了一个方法setUserVisibleHint。setUserVisibleHin
xiangzhihong
2018/02/02
9170
4-AVI--Fragment与ViewPager结合
零、前言 [1].认真看下图Fragment在ViewPager里的默认生命周期(可在浏览器中单独打开网页查看动图,清晰很多) [2].名字数据随机获取见:随机数据生成 [3].ViewPager的默认加载模式见: ViewPager的基本使用 [4].Fragment实现懒加载,ViewPager的实现见: ViewPager的基本使用 大致过程 打开:创建0,1页 左滑:创建2,1被暂停 再左滑:创建3,2被暂停,并销毁0的视图!注意:Fragement并没有销毁 点击返回键时所
张风捷特烈
2018/09/29
6530
4-AVI--Fragment与ViewPager结合
首页-底部Tab导航(菜单栏)的实现:FragmentTabHost+ViewPager+Fragment
Android开发中使用底部菜单栏的频次非常高,主要的实现手段有以下: - TabWidget - 隐藏TabWidget,使用RadioGroup和RadioButton - FragmentTabHost - 5.0以后的TabLayout - 最近推出的 Bottom navigation
Carson.Ho
2019/02/22
2K0
Fragment三问—B站真题
Fragment作为Android最基本,最重要的基础概念之一,也是Activity的好搭档,在开发中经常会和他打交道。今天的三问就说关于Fragment:
码上积木
2020/10/29
7540
Android开发之Fragment回退栈
在Android开发之Fragment动态使用一文中,说到replace方法切换Fragment,会造成Fragment不断销毁、创建,但是有没有办法实现像Activity一样通过栈的方式来管理Fragment呢?答案是可以的,本文就来探讨一下。 一、Fragment回退栈 Activity切换时,相信大家都知道是通过栈的形式,不断压栈出栈,在Fragment的时候,如果你不是手动开启回退栈,它是直接销毁再重建,但如果将Fragment任务添加到回退栈,情况就会不一样了,它就有了类似Activity的栈管理
YungFan
2018/04/24
1.3K0
Android开发之Fragment回退栈
android-懒加载fragment
用于viewpager+fragment布局 import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; /** * <h1>懒加载Fragment</h1> 只有
tea9
2022/07/16
3710
Android Fragment懒加载新思路
大概就是这个方法可以告诉当前Fragment的是否对用户可见,但是可以在生命周期外调用,所以生命周期的方法回调可能不是很准确。所以在Android x里面,Google推荐我们使用 setMaxLifecycle.
Petterp
2022/02/09
6350
Android Fragment懒加载新思路
Android 点将台:撒豆成兵[- Fragment -]
Fragment(碎片) 拥有生命周期,含有视图,可视可交互的界面 。 本文源码可见此处 1.Fragment和Activity生命周期的测试 --- Fragment和Activity生命周期 --- Fragment和Fragment切换时生命周期 --- Fragment与嵌套的子Fragment的生命周期 2.Fragment和Activity或其他Fragment数据传递 --- Activity --> Fragment --- Fragmen
张风捷特烈
2020/04/30
8700
Android 点将台:撒豆成兵[- Fragment -]
【Android】再来一篇Fragment的懒加载(只加载一次哦)
2017-7-14更新: 目前有人使用后出现了诸如首次打开显示空白界面,但点击有反应;或来回切换又变空白界面的问题。这些问题我暂时还不知道该怎么解决,后期有时间时会具体去分析下问题该怎么解决。所以你如果要使用该代码,希望考虑一下,我自己的小应用目前是没碰到这些问题。
请叫我大苏
2018/05/17
1.7K0
首页-底部&顶部Tab导航(菜单栏)的实现:TabLayout+ViewPager+Fragment
Android开发中使用顶部 & 底部Tab导航栏的频次非常高,主要的实现手段有以下:
Carson.Ho
2019/02/22
4.3K0
Android基础:Fragment,看这篇就够了
Fragment 作为 Android 最基本,最重要的基础概念之一。本文从为什么出现 Fragment 开始,介绍了相关的方方面面。
天天P图攻城狮
2018/02/02
5K1
Android基础:Fragment,看这篇就够了
推荐阅读
相关推荐
【Kotlin报错已解决】java.lang.IllegalStateException: Fragment not attached to Activity
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验