关于Fragment的那些事

从Podfile到分享成功:ShareSDK小红书模块集成全流程实战(附视频分享代码) 本文详细介绍了iOS应用如何通过ShareSDK集成小红书分享功能的全流程,包括环境配置、SDK初始化、图片和视频分享实现,以及常见问题排查和性能优化策略。特别针对视频分享这一高频需求场景,提供了完整的代码示例和实战技巧,帮助开发者快速实现社交分享功能。 阅读详情

Fragment是当今Android APP设计中常用的一个东西了,可以把它理解为碎片,Fragment是依附于Activity的。前面有一篇文章详细介绍说Fragment的生命周期Android中Fragment的生命周期详解。

今天,主要讲讲使用Fragment时的一些其他事情。

情形一:
我们经常会拿ViewPager和Fragment一起使用。由于ViewPager默认具有预加载机制(默认会预加载当前界面的左右两个界面),所以我们在进行业务处理时需要注意这一点。当然我们可以通过重写ViewPager来取消预加载机制。注意:通过viewPager.setOffscreenPageLimit(0)是无法取消预加载机制的,查看源码便知,

    private static final int DEFAULT_OFFSCREEN_PAGES = 1;
    public void setOffscreenPageLimit(int limit) {
        if (limit < DEFAULT_OFFSCREEN_PAGES) {
            Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
                    DEFAULT_OFFSCREEN_PAGES);
            limit = DEFAULT_OFFSCREEN_PAGES;
        }
        if (limit != mOffscreenPageLimit) {
            mOffscreenPageLimit = limit;
            populate();
        }
    }

情形二:
我们仍然拿ViewPager和Fragment一起使用,比如说此时一共有4个Fragment,我们进行以下设置:viewPager.setOffscreenPageLimit(3);、
此时,默认会启动时就将4个Fragment全部加载出来。
假如说4个Fragment分别叫做AFragment、BFragment、CFragment、DFragment。此时各个Fragment的生命周期的调用顺序如下:
AFragment—onAttach
AFragment—onCreate
BFragment—onAttach
BFragment—onCreate
CFragment—onAttach
CFragment—onCreate
DFragment—onAttach
DFragment—onCreate
AFragment—onCreateView
AFragment—onActivityCreated
AFragment—onStart
AFragment—onResume
BFragment—onCreateView
BFragment—onActivityCreated
CFragment—onCreateView
CFragment—onActivityCreated
DFragment—onCreateView
DFragment—onActivityCreated

假如说这4个Fragment依附的Activity叫做MainActivity,那么从MainActivity跳转到其他Activity,4个Fragment的生命周期的调用顺序如下:
AFragment—onPause
BFragment—onPause
CFragment—onPause
DFragment—onPause
AFragment—onStop
BFragment—onStop
CFragment—onStop
DFragment—onStop

再从其他Activity回到MainActivity,4个Fragment的生命周期的调用顺序如下:
AFragment—onResume
BFragment—onResume
CFragment—onResume
DFragment—onResume

注意此时进行Fragment的切换,是不会调用到onResume方法的,此时我们可以通过

public void setUserVisibleHint(boolean isVisibleToUser)

方法来进行业务处理

情形三:
进行Fragment的切换,我们一般会使用到add/replace,也可以使用show/hide。
这里,我们先来看几个概念:
1、FragmentManager
Fragment管理器
如果是在FragmentActivity中,我们可以通过getSupportFragmentManager()得到FragmentManager对象;
如果是在Activity中,我们可以通过getFragmentManager()得到FragmentManager对象;
如果是在AppCompatActivity中,我们可以通过getSupportFragment()得到FragmentManager对象;
如果是在Fragment中,我们可以通过getChildFragmentManager()得到FragmentManager对象。
2、FragmentTransaction
Fragment事务
使用FragmentTransaction时需要注意,我们在使用FragmentTransaction进行commit时,不能使用之前已经commit过的FragmentTransaction对象,而应该通过fragmentManager.beginTransaction得到一个新的FragmentTransaction对象。

下面我们先看一下,
使用add/replace。举例如下:

AFragment aFragment = new AFragment();
FragmentManager fragmentManager = getSupportFragmentManager();  //此处只是示例代码,实际在项目中根据情况做改动,比如此处可以将fragmentManager作为全局变量来声明
fragmentManager.beginTransaction().add(R.id.linear_fragment, aFragment).commit();  //R.id.linear_fragment对应的布局是存放Fragment的布局

@Override
public void onClick(View v) {
       switch (v.getId()) {
             case R.id.fragment_a:
                     AFragment aFragment = new AFragment();
                     fragmentManager.beginTransaction().replace(R.id.linear_fragment, aFragment).commit();
                     break;
             case R.id.fragment_b:
                     BFragment bFragment = new BFragment();
                     fragmentManager.beginTransaction().replace(R.id.linear_fragment, bFragment).commit();
                     break;        
       }
}

假如说AFragment和BFragment所依附的Activity叫做MainActivity,此时从MainActivity跳转至其它Activity,只有当前Fragment的onPause和onStop会被调用,当从其它Activity回到MainActivity的时候,只有当前Fragment的onResume会被调用。

使用show/hide,举例如下:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.linear_fragment, currentFragment).show(currentFragment).commit();

private void showFragment(Fragment fragment) {
      if (currentFragment != fragment) {
          FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
          fragmentTransaction.hide(currentFragment);
          currentFragment = fragment;
          if (!fragment.isAdded()) {
              fragmentTransaction.add(R.id.linear_fragment, fragment).show(fragment).commit();
          } else {
               fragmentTransaction.show(fragment).commit();
          }
      }
}

假如说我们一个有3个Fragment,分别叫做AFragment、BFragment、CFragment,这些Fragment依附的Activity叫做MainActivity,如果这些Fragment都被添加进队列,那么此时从MainActivity跳转至其它Activity,这3个Fragment的onPause、onStop都会被调用,关于调用顺序取决于Fragment被添加进队列的顺序,比如说:AFragment第一个被添加进队列,CFragment第二个被添加进队列,BFragment最后一个被添加进队列,那么此时方法执行顺序为:AFragment—onPause、CFragment—onPause、BFragment—onPause、AFragment—onStop、CFragment—onStop、BFragment—onStop。如果此时从其它Activity回到MainActivity,这3个Fragment的onResume也都会被调用,关于调用顺序同样取决于Fragment被添加进队列的顺序,还是举刚才的例子,对应的是:AFragment—onResume、CFragment—onResume、BFragment—onResume。

此时,假如说我们要实现类似于以下需求:
从AFragment切换到BFragment(此时AFragment、BFragment都已经被添加进队列了),AFragment中停止播放视频,切换回AFragment,接着播放视频,该怎么实现呢?
此时AFragment的onPause、onStop、onResume方法都不会被调用,其实此时我们可以通过onHiddenChanged这个方法来实现我们的需求,我们来看源码中对该方法的定义如下:

public void onHiddenChanged(boolean hidden) {
}

OK,最后我们再来看一下FragmentTransaction的主要方法。
一、add(id, fragment):添加fragment到队列中,并显示该fragment到指定布局中。
生命周期调用:
当fragment与activity建立连接并被创建时:
onCreateView()、onActivityCreated()、onStart()、onResume()
当fragment与activity建立连接但是未被创建时:
onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()
当fragment与activity未建立连接并且未被创建时:
onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()

二、replace(id, fragment):先检查队列中是否已经存在,存在就会崩溃,不存在就会进入队列并把其他fragment清出队列,最后显示该fragment到指定布局中。
生命周期的调用:同add(id, fragment)

三、show(fragment):显示队列中的指定fragment。
生命周期的调用:
如果之前被调用过hide(fragment),则回调onHiddenChange(boolean hidden)

四、hide(fragment):隐藏队列中指定的fragment,相当于调用视图的setVisibility(View.GONE)。
生命周期的调用:
回调onHiddenChange(boolean hidden)

五、detach(fragment):销毁指定fragment的视图,并且该fragment的onCreateView()不能再被调用(除非调用attach(fragment)重新连接)。
生命周期的调用:
回调onDestroyView()

六、attach(fragment):创建指定fragment的视图。标识该fragment的onCreateView()能被调用。
生命周期的调用:
当队列中存在该fragment时且被调用detach(fragment)时,回调onCreateView()、onActivityCreated()、onResume()。

七、addToBackStack(string):使本次事务增加的fragment进入当前activity的返回栈中。当前参数是对返回栈的描述,没有什么实际用途。传入null即可。

八、commit():提交本次事务,可在非主线程中被调用。主要用于多线程处理情况。

九、commitNow():提交本次事务,只在主线程中被调用。这时候addToBackStack(string)不可用。

注:
一、
入队的标准是:该fragment的onCreateView()被调用。
出队的标准是:该fragment的onDetach()被调用。
二、
fragment被创建时,生命周期方法回调:
onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()
销毁时(没有用到返回栈):onPause()、onStop()、onDestroyView()、onDestroy()、onDetach()
重新返回到上一个Fragment(没有用到返回栈):onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()
销毁时(用到返回栈):onPause()、onStop()、onDestroyView()
重新返回到上一个Fragment(用到返回栈):onCreateView()、onActivityCreated()、onStart()、onResume()

手把手教你用yt-dlp批量下载YouTube视频数据集(附TikTok/Kaggle资源) 本文提供了一份构建视频数据集的实战指南,重点介绍了使用yt-dlp工具批量下载YouTube视频的高级技巧,包括环境配置、批量参数设置与自动化脚本。同时,文章还整合了TikTok、Kaggle及学术开源数据集等多源高质量视频资源,并分享了数据清洗、格式统一与管理的完整流程,帮助研究者和开发者高效获取与处理训练数据。 阅读详情

相关推荐

大众点评爬虫实战:如何用Python绕过反爬机制获取评论数据(附完整代码)

本文深入探讨了2024年使用Python进行大众点评数据采集的实战策略。文章详细解析了现代反爬机制的核心逻辑,并提供了从构建拟人化请求会话、应对动态内容与接口加密,到工程化实践(代理调度、状态持久化)的完整解决方案与代码示例,旨在帮助数据分析师稳健获取评论数据,用于后续的文本挖掘与商业洞察。

weixin_29084111的博客 1920

ViewPager+Fragment首页布局的加载优化

本文通过设置ViewPager的setOffscreenPageLimit参数和提供适配ViewPager的Fragment来优化加载耗时。

qq_36267931的博客 1836

国产麒麟系统中的PaddleOCR离线绿色部署:高效安全的文字识别新纪元

摘要:本文详细介绍了PaddleOCR在银河麒麟V10SP1系统上的离线部署方案。通过Conda虚拟环境隔离依赖,采用离线包安装方式实现无网络部署,支持80+语言识别。重点讲解了模型量化剪枝优化、多线程处理等性能调优技巧,并提供了完整的OCR识别代码示例。该方案具有数据本地化处理的安全优势,适用于医疗票据数字化等对隐私要求严格的场景,同时解决了模型加载失败、内存不足等常见问题。

墨夶的博客 1228

Android 懒加载

为什么要使用懒加载? 我们经常会在项目中使用ViewPager+Fragment加载Tab数据,但是由于ViewPager有预加载的功能,所以当我们第一次进入时会加载第一页和第二页的数据。假如我们在第二页做了一些耗时操作,就有可能导致页面不流畅,为了解决这种情况,所以就需要使用到懒加载。 什么是懒加载? 懒加载说白了就是当Fragment可见时,才进行网络请求或者耗时操作;当Fragment不可见...

乌托邦的博客 1347

锂电池剩余使用寿命预测(RUL) | 基于Stacked-LSTM-Autoencoder的锂电池寿命多变量多步预测(Tensorflow)

锂电池剩余使用寿命预测(RUL) | 基于Stacked-LSTM-Autoencoder的锂电池寿命多变量多步预测(Tensorflow)

前程算法屋的博客 851

Python爬虫实战:使用Scrapy+Playwright高效获取电力市场数据

本文将详细介绍如何使用Python构建一个高效的电力市场数据爬虫系统。我们将结合Scrapy框架和Playwright浏览器自动化工具,解决电力市场网站常见的反爬机制,实现数据的稳定抓取。文章包含完整的项目搭建流程、代码实现、数据处理方案以及部署建议,帮助读者掌握现代爬虫开发的核心技术。关键词:Python爬虫、Scrapy、Playwright、电力市场、数据采集、反爬对策python复制下载# 基本字段region = scrapy.Field() # 区域。

2201_76125261的博客 1881

Android中的setOffscreenPageLimit()

用法: viewPager.setOffscreenPageLimit (5); 在使用ViewPagerj

巫巫巫 1万+

基于深度学习的人脸识别考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

基于深度学习的口罩人脸识别的考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1825

Android ViewPager2 setOffscreenPageLimit预加载Fragment,Kotlin

2、如果设置了mOffscreenPageLimit(并且,mOffscreenPageLimit通过setOffscreenPageLimit()这个API接口也只能设置 >=1 的值),ViewPager2就退化成过去老版的ViewPager了,除了把当前可见的那个Fragment加载出来外,还会根据用户设置的mOffscreenPageLimit值,加载mOffscreenPageLimit个不可见的Fragment。日志显示,只加载了当前可见的0号Fragment,没有加载1号Fragment。

Zhang Phil 2308

【学习系列】SAP RAP 1:关于RAP的一些基本介绍

摘要:SAP RAP和CAP是两种不同的开发模型。RAP(RESTful ABAP)用于在S/4HANA等ABAP平台上构建现代业务应用,基于CDS+OData,适合ABAP开发者扩展核心业务。CAP(云应用编程模型)是BTP上的云原生框架,支持Node.js/Java,适合构建跨系统集成应用。RAP优势在于与S/4HANA深度集成,CAP则更灵活,支持多云环境。选择依据主要取决于开发平台(S/4HANA或BTP)、技术栈(ABAP或Node.js/Java)及应用场景(核心扩展或云原生开发)。

DeveloperMrMeng的博客 1161

Bash Shell 系统巡检脚本

部分安全相关检查需要root权限,建议通过sudo运行完整检查。

老韩的Linux云计算架构师进阶之路 96

Android番外篇 ViewPager.setOffscreenPageLimit()

一、前言 问题缘由:ViewPager.setOffscreenPageLimit()设置的预加载数量 setOffscreenPageLimit() 方法设置的默认值是 1 (1)ViewPager 会预加载几页 (2)ViewPager 会缓存 2*n+1 页(n为设置的值) 如设置为n=1,当前在第一页,会预加载第二页,滑倒第二页,会预加载第三页,当滑倒第三页,第一页会销毁,第四页会加载。 所以ViewPager 中Fragment的生命周期: setOffscreenPageLimit 的

圈池 2176

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

fragment那点事

前言: 先来介绍一个专业术语: "内存重启":“术语”,安卓app有一种特殊情况,就是 app运行在后台的时候,系统资源紧张的时候导致把app的资源全部回收(杀死app的进程),这时把app再从后台返回到前台时,app会重启。这种情况下文简称为:“内存重启”。(屏幕旋转等配置变化也会造成当前Activity重启,本质与“内存重启”类似)         在系统要把app回收之前,系统会把Ac

二货小青年的博客 471

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Fragment修炼奥义之Fragment复用那些事

概述 作者:怪盗kidou 链接:https://www.jianshu.com/p/31f013df7580 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。 为什么要复用Fragment 如何避免fm.getFragments FragmentManager.findFragmentById的使用 FragmentManager.findFragmentB...

qq_14985595的博客 903

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

关于Fragment跳转的那些事

由于对于之前学习过的知识,我们对于fragment之间的跳转都是通过在fragment外部的一个activity的事件监听来控制fragment页面的切换。想到这个代码可以用来切换不同的fragment我就立即把他复制到我的fragment的监听事件中去,结果依旧是报错,只有在activity中getFragmentManager()才生效。然后在MainActivity去接收这个跳转带来的值,进行逻辑判断,判断正确则调用MainActivity的跳转fragment方法。这样就可以完成跳转了。

2303_77646594的博客 606

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

关于继承Fragment的事

如果想要获取Fragment内的控件 可在onCreateView()方法中得到 比如 View view = inflater.inflate(R.layout.quantity,container,false); bt_quantity =(Button)view.findViewById(R.id.bt_quantity); 如果Fragment中需要用到

z1760921018的博客 675

谈谈Fragment的用法之Fragment实现Tab切换中的那些事

首先底部的我们使用FragmentTabHost即可,这里我们对系统的这个控件做了简单的修改。系统的这个控件在切换tab的时候是会detach 当前的Fragment, 也就是销毁当前Fragment的视图。这样就会导致每次切换tab的时候都会重新走onCreateView,重新创建Fragment view。这样我们之前的状态就会丢失,这当然不是我们所想要的。

wjr1949的博客 2210

ViewPager中Fragment状态保存的哪些事

Hi ,很高兴见到你! 引言 在使用 ViewPager 时 , 如果我们的适配器使用的是 FragmentStatePagerAdapter ,那么当我们重新滑到之前已销毁的页面时,一般情况下页面的状态依然将保持不变(比如 RecyclerView 的 滚动位置等,EditText 的 输入内容 等), 或者说 View 历史状态被还原了。 本文的主旨就是解释其 保存与还原内部的原理以及过程。 基础概念 ViewPager 官方的适配器有两种,即 FragmentPagerAdapter 以及 Fragm

petterp的博客 1033

Fragment,Activity,FragmentManager之间那点事

当我们在Activity里动态创建一个Fragment时,Fragment是如何将自己的View填充到Activity中呢,要弄清这个问题,我们不妨从源码中找答案(Android4 4) 第一步:Android 中Activity的启动 我们中ActivityThread中的main方法讲起讲(如果要了解Activity的创建,可以参看老罗的Android之旅博客) main()方

woshiluotao的专栏 1984

关于ViewPager和Fragment的二三事

这两天看到的一些关于ViewPager+Fragment使用的一些文章,都很有价值,于是集中进行一次转载。里面有部分是原创内容有部分是转载内容。 友盟页面统计 - 关于Viewpager中的Fragment的生命周期  原文地址 Activity和Fragment各自理论上的生命周期     Activity的生命周期是较为经典也最清晰的,在此不表;     Fragment从出

piglite的专栏 1763

关于Fragment切换界面空白那些事

Fragment切换变空白问题解决 楼主在做一个类似主界面于网易新闻的demo 主界面下方为5个父Fragment,Fragment之间的切换用FragmentTransaction 第一,第二个父界面分别为fragment+viewpager选项卡那种界面页面大概是这样 问题来了……. 我在开发到第二个父界面时(第二个父界面与第一个类似),程序第一个加载为第一个父界面,第一个界面显示正常,但是切

ysxlmk的博客 2480

Fragment那点事①Fragment栈管理

在分析栈管理之前先来了解几个基本的概念和 FragmentManager 中主要属性代表什么意思。FragmentManagerImpl FragmentManagerImpl 是 Fra...

Android技术之家 1123

Android中关于Fragment的那些事、那些坑

引言 在Android3.0开始,Android引入了Fragment。当初最主要的目的是为了给大屏幕手持设备提供更加灵活和动态的UI设计。随着应用功能越来越多,界面越来越复杂,我们会利用Fragment对Activity的界面进行模块化编程。比如一个Activity界面内有多个请求,每个请求得到的结果展示不同的UI片段,那么我们就可以将Activity利用Fragment来完成UI模块化。

青青的专栏--C/C++ OOA/D Design Pattern 1239

android:Fragment动画那点事

最近很多人对Fragment的动画很感兴趣,我就做个例子给大家看看。既然要做,我就做下面几类动画:弹入弹出动画:从“上下左右”进入,从“上下左右”弹出,当然,你怎么组合都可以。另外你也可以加一些透明度的变化,这就看你的发挥了。。。1.先写动画的xml文件做开发的都知道,在/res/anim/目录下,新建xml的动画文件,比如:fragment_slide_in_from_bottom.xml <t

郑海波(莫川)的优快云博客 6043

【android】Fragment动画那点事

最近很多人对Fragment的动画很感兴趣,我就做个例子给大家看看。既然要做,我就做下面几类动画: 弹入弹出动画:从“上下左右”进入,从“上下左右”弹出,当然,你怎么组合都可以。另外你也可以加一些透明度的变化,这就看你的发挥了。。。 1.先写动画的xml文件 做开发的都知道,在/res/anim/目录下,新建xml的动画文件,比如: fragment_slide_in_fr

u011494050的专栏 1219
上一篇: 阿里云OSS使用总结
下一篇: 结合项目经验来谈使用MPAndoridChart的总结(一)
zdj_develop
博客等级 码龄11年 56粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值