Fragment生命周期新认识

AlertDialog二次点击报You must call removeView() on the child's parent first错的解决方法 今天在工作中用到了自定义的Dialog,理想总是很美好的,因为在自定义Dialog和创建Dialog的过程比想象的要顺利,所呈现的效果和想象中的一致,但是正当自己沾沾自喜的时候,在第一次点击弹出Dialog之后,第二次点击程序却闪退了。一开始的喜悦瞬间消失了,痛定思痛,查看LogCat发现报错java.lang.IllegalStateException The specified child a 阅读详情

文章内容也许与标题并不是很相符,我主要想写的只是在项目中遇到的一些小问题以及问题的是如何解决,至于写这个标题只是因为这些错误是由于对Fragment的生命周期理解不够深刻而导致的。

为了便于分析,贴出有问题和解决问题后的代码(只是一些关键代码):

有问题:

     代码段1:

代码段2:

代码段3:

问题解决后:

代码1:

代码2:

代码4:

     代码1和2都写在onCreateView(),接下来描述下产生的问题。

问题一:

主界面是个带底部标签栏的界面,实现方法是FragmentActivity+Fragment,其中第一个Fragment中有一个ViewPager,产生的问题是当切换到第二个标签页后再切回到带有ViewPager的标签页时,第一个小圆点会一直处于选中状态。

问题就出在代码1中,因为每次切换页签后,Fragment的onCreateView()都会得到执行,我一开始只是dots.get(0),所以小圆点会一直选中第一个。只需要改成dots.get(currentItem%viewList.size())问题就解决了。(currentItem为当前页,viewList为ViewPager资源集合)。

问题二:

当切换到第二个标签页后再切回到带有ViewPager的标签页时,ViewPager轮播到最后一张图片再向第一张图片轮播时

程序崩溃(ViewPager是无限自动轮播的),报index越界的错误。之前没有进行页签切换时并没有发生这个错误ViewPager

能顺利的一直自动轮播,但是进行页签切换后却报错了。后来打印viewList的size发现,viewList的size居然变成了10!

但是我原来只放了5张图片。

究其原因错误就是发生在代码段3(写在onCreateView()中),切换页签再切换回来时,Fragment的onCreateView()又得

到执行,所以又往viewList集合中添加了5个view,导致viewList的size变为了10,解决办法是当切换页签时Fragment的

onPause(),onStop(),onDestroyView()会得到执行,所以我在onDestroyView()中先将viewList清空了,这样就不会有

viewList长度变化而导致的错误了。

问题三:

前面两个问题解决了,心里也舒了一口气,但是运行的时候还是有地方不爽,就是切换回来后,ViewPager会先跳到

一页,然后按原来的顺序继续轮播(比如我切换前图片播到了第4页,等切换回来后图片会先跳转到第3页后,有跳到第

5页继续按顺序轮播)。检测前后代码发现是因为当切换到别的页签时,图片还是继续在轮播,导致它会有一个不协调

的跳转,所以我的处理办法是在onDestroyView()中将自动轮播停止了。如何实现自动轮播的开始和停止可以参考我上

一篇ViewPager无限自动轮播+动画。

结语:

记录这篇文章更主要的目的是为了给自己总结,同时也希望能够为遇到类似问题同是android路上刚刚启程的新手的一

些微薄的帮助。(也许很少会有人犯这样的问题),但是我还希望把它记录下来,作为我android学习路上的一道风景。


C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装 Muduo is a multithreaded C++ network library based on the reactor pattern. muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。 muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码... 阅读详情

相关推荐

VS Code + EIDE + Clangd 构建 Keil/MDK 嵌入式开发新范式

嵌入式C/C++开发长期受限于传统IDE的语法理解弱、导航卡顿、跨工程复用难等问题。Clangd作为基于AST的现代语言服务器,结合EIDE对Keil uVision和ARM MDK工程文件(.uvprojx)的深度解析能力,可将编译配置、芯片型号、内存模型、扩展关键字等语义精准翻译为标准compile_commands.json,从而实现智能跳转、宏展开识别、结构体实时展开等高阶编辑体验。该方案不替换Keil/MDK编译与烧录流程,仅升级代码理解层,天然兼容STC8051、STM32 Cortex-M、G

weixin_34321753的博客 352

Android中解决ViewPager+多Fragment切换时候页面中轮播图出现空白的问题

附:ViewPager+Fragment实现页面可参考另一篇文章,链接如下: Android中使用ViewPager和Fragment实现底部导航栏 一、问题描述及解决办法 本文主要说明在viewpager滑动时候出现轮播图空白的解决办法(我加了之后问题解决了)。 将ViewPager的预加载个数设置为你的所有Fragment的数量。因为ViewPager会默认有这个预加载机制,系统默认设置的加载页数就是1,现在可以通过用户权限的接口来动态控制加载页面的个数了。 //将ViewPager的预加载个数设置为你

qq_46269365的博客 771

开关电源环路稳定性分析(01)-Buck变换器

这篇文章主要是根据Buck变换器的拓扑结构,利用欧姆定律,基尔霍夫定律,积分微分,这些我们所熟悉的理论推导出了开关电源输入和输出关系的表达式,我相信看完这篇文章,应该是可以自己推导一次。在后面的文章中,我们同样会按照这样的风格,尽量使用大家都已经掌握的知识,来一步一步的拆解晦涩难懂的环路稳定性的问题,在前面先把积木搭起来,后面综合分析的时候就不会显得那么困难!

D_Katter的博客 3831

Fragment两种添加方式下生命周期调用的区别

Activity onCreate中直接调用两次add,生命周期如下 FragmentTwo会赶上FragmentOne的生命周期同步 FragmentManager fragmentManager = getSupportFragmentManager(); fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.linear, fragmentOne);

Jiafeiqian的博客 259

Unity 调用安卓内部安装apk

一、申请权限 应用内安装其他应用的权限属于特殊权限,需要在特殊申请。 Uri packageURI = Uri.parse("package:" + mContext.getPackageName()); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI); startA...

BDDNH的博客 1238

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)

2301_81256766的博客 1257

探究Activity和Fragment各个情况的生命周期

- - - 打开APP :  03-29 18:56:04.461 11735-11735/com.demo.lifecycle D/MainActivity: ---------- onCreate 03-29 18:56:04.485 11735-11735/com.demo.lifecycle D/Fragment1: ---------- onAttach 03-29 18:56:

一名小安卓的博客 466

实战MSP-M0G3507与陶晶驰串口屏的通信协议解析

本文详细解析了MSP-M0G3507微控制器与陶晶驰串口屏的通信协议实现。内容涵盖串口配置、协议帧结构、数据校验机制及ASCII协议实战代码,重点介绍了陶晶驰串口屏的指令集应用和调试技巧,为嵌入式开发提供可靠的串口通信解决方案。

h9j8k7l6m5n的博客 867

测试fragment生命周期

情景1:viewpager切换fragment 启动: 切换fragment: 无.在adapter中初始化完毕,切换不产生新的实例 home,锁屏: 从后台切回: back:: 情景2:getSupportFragmentManager().beginTransaction().replace(R.id.fragment_

病毒才俊 573

使用 Simulink + Simscape Electrical 对锂电池储能系统的充放电管理策略进行建模与仿真

摘要:本文详细介绍了基于Simulink的锂电池储能系统充放电管理策略建模与仿真方法。重点阐述了系统结构设计、建模过程(包括锂电池模型、充放电控制器、热管理系统等模块搭建)以及仿真设置。通过分析荷电状态管理、温度控制和功率限制等核心要素,展示了如何实现安全高效的充放电策略。仿真结果可验证系统性能,为优化管理策略提供依据。该方法为新能源存储和智能电网应用提供了实用的仿真分析工具。

amy_mhd的博客 157

YOLOv11改进策略【小目标改进】| Shape-NWD:融合改进,结合Shape-IoU和NWD 更好地适应小目标特性

Bw−wgt2h−hgt2weight2Bweight2w−wgt​2h−hgt​2​其中weight2weight = 2weight2。

Limiiiing的博客 3049

Android-Activity与Fragment的生命周期

Activity与Fragment的生命周期 一.Activity的生命周期 通过上述图示,我们可以总结Activity的生命周期规律如下: 1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。 2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Acti...

Android_xi的博客 646

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

孤独的单刀 5474

OnTouch事件ACTION_DOWN,ACTION_MOVE,ACTION_UP的事件拦截

今天看了郭神的  Android事件分发机制完全解析,带你从源码的角度彻底理解(上) 对其中的一些细节还不是很理解,就自己测试了一下。 简单的给一个按钮注册了触摸事件: button.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEv

My_First_ID的博客 4432

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Listview里包含组件(checkbox)点击事件和Item的点击事件冲突

今天在写了个小需求,ListView里包含checkbox,点击ListView的item时要求将item的内容显示在一个TextView中(TextView不包含在item中),并同时改变checkbox的checked状态。 代码很简单,只是一开始并没有意识到ListView的item点击事件与checkbox的点击事件存在冲突,checkbox的点击事件优先级高于item的点击事件,所以在

My_First_ID的博客 3749

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

使用RecyclerView报错:ClassNotFoundException android.support.v4.util.ArrayMap

在使用RecyclerView的时候(eclipse),编译没有问题但是在运行时报错ClassNotFoundException android.support.v4.util.ArrayMap导致应用直接崩了。原因是导入的support.v4不正确。 解决办法:工程目录->properties->java build path->libraries->Android Private L

My_First_ID的博客 3578

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Retrofit2.0中如何创建JSON所对应的javaBean

本文重点讲解在Retrofit2.0中如何讲比较复杂的JSON对象转化为javaBean,而不过多介绍Retrofit2.0的用法,因为讲解Retrofit2.0的文章已经有很多人写了,也写的很详细,我作为一个初用Retrofit2.0的新手,便不班门弄斧了,写这篇文章的主要目的是因为自己在使用的过程中遇到了一些小问题在多方查找下得已解决,因为网上资料比较散,所以在此做个小小的总结。 如今的An

My_First_ID的博客 2906

Volley框架使用报错:NetworkDispatcher.run: Unhandled exception java.lang.NullPointerException

volley是google在2013年的I/O大会上推出的一个网络通信框架,在请求网络数据的时候,使用volley大大提高了我们的开发效率,但是众所周知使用volley发起POST请求时,我们需要通过在xxxRequest的匿名类中重写getParams()方法, 比如有这么一个stringRequest: StringRequest stringRequest = new StringReq

My_First_ID的博客 2168

使用EventBus代替startActivityForResult向上传递数据

这几天接触了下EventBus,EventBus是一款针对Android优化的发布/订阅事件总线。对于Fragment和Fragment通信,Service和Fragment通信,EventBus是一个不错的选择。 以前我们如果想要在Activity之间向上传递数据,都会采用startActivityForResult()方法来实现。其实用EventBus也能实现这个功能。 首先新建一个事件类

My_First_ID的博客 1909

ViewPager无限自动轮播+动画

ViewPager几乎在每一个app中都会有使用,可以做导航页,也可以做广告、图片的播放。最近在做的app也用到了ViewPager,具体要实现的功能是能够无限轮播,并且在自动轮播时,图片在切换时能够有动画效果,当手指触摸时停止自动轮播,手指抬起时继续自动轮播。 闲话不多说,直接上代码 自定义ViewPager: public class MyViewPager extends ViewP

My_First_ID的博客 1862

RecyclerView使用详解

RecyclerView是Android 5.x版本中新添加的一个全新控件,他比ListView,GridView更加的灵活,我们能够使用RecyclerView就完成ListView,GridView所做的工作,同时使用RecyclerView也能非常方便的实现瀑布流的效果。 一.竖屏ListView,横屏GridView效果 MainActivity代码: public class

My_First_ID的博客 1649

Cascade_Master的一个小bug修复

之前在项目中有地方要用到省市县的选择,就使用了开源的Cascade_Master,很好用的一个控件,在这里谢谢作者的分享。 但是在使用的时候发现有一点小小的问题,就是当滚动省和市后,而不去滚动区,那么视觉上虽然区的滚轮也相应改变,但是最终获取到的区却是之前一次滚动后的值,而并不是于省市对应的区。查看源代码后发现,作者在控件的onChanged事件中是这样写的: public void onCh

My_First_ID的博客 948

自定义滑动开关SwitchButton

在很多app中都会有滑动开关的应用场景,之前在自己的项目中也用到了,自定义了一个滑动开关,就叫SwitchButton吧。实现原理很简单,闲话不多说,直接上代码: public class SwitchButton extends View implements android.view.View.OnClickListener { private Bitmap mSwitchBotto

My_First_ID的博客 729

自定义控件——自定义属性

当我们自定义组件时,除了可以使用android系统为我们提供好的属性之外,还可以自定义属性。自定义属性主要步骤如下:      第一步:       在res/values目录下新建attrs.xml文件,然后在attrs.xml文件中声明属性。       例如:       这里我们定义了3个自定义属性maxRow,maxColumn和

My_First_ID的博客 711

View的滑动冲突解决

一.滑动冲突的场景 当两个都可滑动的控件处于内外两层的关系时,这个时候我们往往会遇到滑动冲突的问题,比如最常见的ScrollView和ListView的冲突,就是最典型的一种滑动冲突场景 虽然能够滑动的控件五花八门,但万变不离其宗,滑动控件大致就分为两类,一类为上下滑动的,另一类即左右滑动的,既然这样那么滑动冲突的场景也是非常有限的。大致可以分为3类: 1.外部滑动和内部滑动方向不一致

My_First_ID的博客 600

Android获取屏幕宽高新方法

这几天做的项目中有用到手机屏幕的分辨率,所以就用一下代码来获取手机的宽高: Display disPlay = getWindowManager().getDefaultDisplay(); int width = disPlay.getWidth(); int height = disPlay.getHeight(); 但是发现这个方法已经过时了,对于强迫症患者来说,一直有黄色

My_First_ID的博客 591
上一篇: ViewPager无限自动轮播+动画
下一篇: 使用EventBus代替startActivityForResult向上传递数据
AndroidShuai
博客等级 码龄12年 2粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值