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

news2024/11/22 10:37:36

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

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

img

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

    @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被选中,打印如下:
第一次进入
setUserVisibleHint 1 false
setUserVisibleHint 2 false
setUserVisibleHint 1 true
onCreateView 1
onCreateView 2

参数为true

2. 从fragment1切换到fragment2,fragment2被选中,打印如下:
1--->2
setUserVisibleHint 3 false
setUserVisibleHint 1 false
setUserVisibleHint 2 true
onCreateView 3

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

3.从fragment2切换到fragment3,fragment3被选中,打印如下:
2--->3
setUserVisibleHint 4 false
setUserVisibleHint 2 false
setUserVisibleHint 3 true
onDestroyView 1 
onCreateView 4

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

4. 后面滑动的过程日志打印如下:
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的生命周期。相关打印如下:
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的生命周期,那么就可以选择在合适的时期对我们的数据进行处理了,避免出现数据未加载或者多次加载的情况了。

更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2023最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/942462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jmeter(二十七):BeanShell PostProcessor跨线程全局变量使用

在性能测试中,两个相关联的接口不一定都在同一个线程组,遇见这种情况时,我们要进行跨线程组传参,此处用登录和查询配送单两个请求举例; 1、登录请求中配置json提取器,将接口返回的token保存在变量中&#…

Linux 指令心法(二)`cd` 更改当前目录

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 cd 是 “Change Directory” 的缩写。这是一个 shell 内建命令,用于在 Linux 和 Unix 系统中改变当前工作目录。通过使用 cd 命令,用户…

Python小知识 - Python中的多线程

Python中的多线程 线程是进程中的一个执行单元,是轻量级的进程。一个进程可以创建多个线程,线程之间共享进程的资源,比如内存、文件句柄等。 在Python中,使用threading模块实现线程。 下面的代码创建了两个线程,一个输…

【数学建模】清风数模正课5 相关性分析

相关系数 相关性分析的关键是计算相关系数,在本节课中将会介绍两种常用的相关系数:皮尔逊相关系数(Pearson)和斯皮尔曼相关系数(Spearman)。 它们可以用来衡量两个变量间相关性的大小,对于不同…

后端面试话术集锦第三篇:spring cloud 面试话术

🚗后端面试集锦目录 💖后端面试话术集锦第一篇:spring面试话术💖 💖后端面试话术集锦第二篇:spring boot面试话术💖 💖后端面试话术集锦第三篇:spring cloud面试话术💖 💖后端面试话术集锦第四篇:ElasticSearch面试话术💖 💖后端面试话术集锦第五篇:r…

面试现场表现:展示你的编程能力和沟通技巧

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【力扣】55、跳跃游戏

var canJump function(nums){let cover 0;for(let i0;i<nums.length;i){if(i<cover){cover Math.max(nums[i]i,cover);if(cover >nums.length-1){return true;}}}}

春秋云镜 CVE-2018-7448

春秋云镜 CVE-2018-7448 CMS Made Simple 2.1.6 RCE 靶标介绍 CMS Made Simple 2.1.6版本存在代码注入漏洞&#xff0c;可以通过 timezone 参数执行任意代码。 启动场景 漏洞利用 1、目的文件夹选择/var/www/html/cms 2、next到第四步&#xff0c;数据库名&#xff1a;cms…

2023-8-29 有向图的拓扑排序

题目链接&#xff1a;有向图的拓扑排序 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n, m; int h[N], e[N], ne[N], idx;int q[N], d[N];void add(int a, int b) {e[idx] b, ne[idx] h[a]…

Android11.0 Launcher3定制化功能之抽屉式(双层)app列表排序功能实现

1.概述 在11.0的系统开发中,在定制Launcher3的开发中,对于抽屉式即双层桌面的workspace的app列表排序的功能,也是常有的需求,把常用的app图标放在前面,其他的可以放在列表后面做个整体的排序,这就需要了解app列表排序的流程,然后根据需求来实现功能 如图: 2.Launche…

面试中的代码写作:如何撰写清晰、高效的示例代码

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

代码随想录算法训练营之JAVA|第四十二天|70. 爬楼梯

今天是第 天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天&#xff0c;如果做不到&#xff0c;完成一件评论区点赞最高的挑战。 算法挑战链接 70. 爬楼梯https://leetcode.cn/problems/climbing-stairs/ 第一想法 这是一个动态规划的入门题目&#xff0c;在看完完全背…

Flutter(九)Flutter动画和自定义组件

目录 1.动画简介2.动画实现和监听3. 自定义路由切换动画4. Hero动画5.交织动画6.动画切换7.Flutter预置的动画过渡组件自定义组件1.简介2.组合组件3.CustomPaint 和 RenderObject 1.动画简介 Animation、Curve、Controller、Tween这四个角色&#xff0c;它们一起配合来完成一个…

操作系统真题

操作系统真题 考点前驱图真题分页存储管理索引文件结构分段存储管理进程的状态进程的同步和互斥 考点 考试只会考察选择题 前驱图真题 c 这是常考题型 b 分页存储管理 将程序分页 --逻辑地址 将内存分为页框&#xff08;物理块&#xff09; --物理地址 程序页的大小和页框的大小…

ros2官方文档(基于humble版本)学习笔记

ros2官方文档&#xff08;基于humble版本&#xff09;学习笔记&#xff08;一&#xff09; 一、安装ROS2二、按教程学习1.CLI 工具配置环境 由于市面上专门讲ROS2开发的书籍不多&#xff0c;近期看完了《ROS机器人开发实践》其中大部分内容还是基于ROS1写的&#xff0c;涉及top…

图像扭曲之波浪扭曲

源码&#xff1a; void wave_sine(cv::Mat& src,cv::Mat& dst,double amplitude,double wavelength) {dst.create(src.rows, src.cols, CV_8UC3);dst.setTo(0);double xAmplitude amplitude;double yAmplitude amplitude;double xWavelength wavelength;double yWa…

【Linux】深入理解文件缓冲区

文章目录 问题引入如何理解缓冲区缓冲区刷新策略问题解释模拟一个文件缓冲区 问题引入 首先看一段代码&#xff1a; #include <stdio.h> #include <string.h> int main() {const char *msg0"hello printf\n";const char *msg1"hello fwrite\n&quo…

Ae 效果:CC Image Wipe

过渡/CC Image Wipe Transition/CC Image Wipe CC Image Wipe&#xff08;CC 图像擦除&#xff09;效果的主要用途是通过使用图像的某个属性&#xff08;如红通道、绿通道、蓝通道、Alpha 通道、亮度、明度、色相或饱和度&#xff09;来创建一个独特的过渡效果&#xff0c;可以…

【算法与数据结构】112、LeetCode路径总和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题通过计算根节点到叶子节点路径上节点的值之和&#xff0c;然后再对比目标值。利用文章【算法和数据…

浅析Redis(1)

一.Redis的含义 Redis可以用来作数据库&#xff0c;缓存&#xff0c;流引擎&#xff0c;消息队列。redis只有在分布式系统中才能充分的发挥作用&#xff0c;如果是单机程序&#xff0c;直接通过变量来存储数据是更优的选择。那我们知道进程之间是有隔离性的&#xff0c;那么re…