当前位置:首页 » 安卓系统 » Androidfragment页面

Androidfragment页面

发布时间: 2025-08-02 03:05:35

‘壹’ Android开发 :Fragment懒加载的几种方式与性能对比

TabLayout+ViewPager+Fragment是我们开发常用的组合。ViewPager的默认机制就是把全部的Fragment都加载出来,而为了保障一些用户体验,我们使用懒加载的Fragment,就是让我们再用户可见这个Fragment之后才处理业务逻辑。

而我们在一些设备或版本中可能就出现懒加载失效的问题。其实谷歌早就把一些懒加载的方案都标记弃用了,我们一直都用的老的随时会失效的Api。万一哪天彻底失效了就会导致线上事故。

接下来我们就看看Fragment的懒加载是如何演变的。谷歌又是推荐我们如何使用的。

在AndroidX还没出来的时候,大家的懒加载应该都是这样。判断setUserVisibleHint的方法,当用户可见的时候才回调方法去加载逻辑。

例如的我封装:

使用的示例:

扩展方法:

Fragment:

到此就实现了onLazyInitData的回调,只有出现Fragment显示在前台的时候才会调用方法,执行逻辑。

每次判断 setUserVisibleHint 和 onHiddenChanged 也麻烦,并且他们并不稳定,我也遇到过不回调的时候。

Android出来之后,给 FragmentStatePagerAdapter 添加了一个 @Behavior int behavior 的参数。

其本质就是内部帮你处理和切换MaxLifecycle:

如何使用呢:

之前的扩展方法以及预留了 behavior 参数,当为1的时候就不会回调 setUserVisibleHint 方法了,我们直接监听 OnResume 即可。

注意这个页面继承的就不是我们自定义的懒加载Fragment了。普通的Fragment 回调 onResume 即可。

ViewPager2出来之后。我们的 FragmentStatePagerAdapter 退出历史舞台。

即便能用,即便效果还是和ViewPage2的效果一样,但是还是标记废弃了。具体原因我也不知道,据说是因为老版本会出现问题导致数据丢失,页面空白。

ViewPage2我们都知道内部是通过RV实现的。但是对于Fragment的处理有单独的Adapter实现。

扩展方法:

使用:

使用的方式和ViewPager差不多,这里的Fragment也是使用普通的Fragment即可。

内存占用分别取三组数据

ViewPager数据

ViewPager2数据

结论 ViewPager2基于RV实现的效果还是比老版ViewPager要骚好一点。

并且老版本标记废弃,大家如果是用ViewPager2的话,还是推荐使用ViewPager2实现。如果大家还是用的老版本的ViewPager也推荐使用behavor参数。使用 onResume 实现懒加载的实现。以后再换到ViewPager2的话,可以无缝切换过来。

说明一下,测试数据仅供参考,毕竟我也不是专业测试,测试数据源也不不多。如有不对的地方,也望大家指正。

‘贰’ Android组件之Fragment(一)---基础知识与运用

Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段!想想,如果一个很大的界面,我们 就一个布局,写起界面来会有多麻烦,而且如果组件多的话是管理起来也很麻烦!而使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理!从而可以更加方便的在 运行过程中动态地更新Activity的用户界面!另外Fragment并不能单独使用,他需要嵌套在Activity 中使用,尽管他拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响,比如Activity 被destory销毁了,他也会跟着销毁!

引用官方的一张图片,其实已经说明问题了,就是为了更好的适配大屏,在大屏的时候,不需要去在一个activity内部通过复杂的布局和界面去实现,只需要去在一个activity内部,通过多个fragment来做界面布局实现即可,而且针对于多个fragment来说, 每个fragment有单独的生命周期,

Demo样例,我们在一个界面中,有上下两个fragment,如图所示:

Step 2: Fragment创建,视图加载,数据赋值
BlankFragment .java

Step 3: Activity在onCreate( )方法中调用setContentView()之后调用FragmentTransaction 进行事务提交
FragmentTestActivity.java

在xml中声明两个fragment,指定为具体的fragment

Step 1:定义Fragment的布局,就是fragment显示内容的

Step 2:自定义一个Fragment类,需要继承Fragment或者他的子类,重写onCreateView()方法 在该方法中调用:inflater.inflate()方法加载Fragment的布局文件,接着返回加载的view对象
BlankFragment.java

Step 3:在需要加载Fragment的Activity对应的布局文件中添加fragment的标签, 记住,name属性是全限定类名哦,就是要包含Fragment的包名,如:

Step 4: Activity在onCreate( )方法中调用setContentView()加载布局文件即可!

针对在一个Activity中的某个Layout中切换Fragment,,无非两种方法:

我们自己看一下方法注释

源码方法注释里面说的很明白,这个方法会移除所有的fragment,然后添加当前的fragment。
这时分为两种情况,一种是fragment已有并且在前台展示,一种是未有或者在后台,针对于前者,此时replace,生命周期不会发生变化,针对后者,生命周期会重新走

分为两种情况,一种fragment已存在,一种未存在,针对于前者,生命周期无变化,但是会回调onHiddenChanged方法,针对于后者,生命周期会创建一次。

1.Fragment是Google官方引入的一个为了适配大屏、多页面的一个组件。您可以理解为它就是一个类而已,只不过里面包含了View,并且与activity的生命周期进行了关联。
2.动态加载与静态加载相对来说,建议使用动态加载,静态加载固定在了xml文件中,永远不变。
3.replace的fragment如果不在前台,会执行所有生命周期,反之不会执行任何生命周期方法;hide+show生命周期并不会发生变化,但是会回调onHiddenChanged方法,在实际开发中,建议add之后,使用hide+show来操作fragment,一方面减少资源的重复加载和创建,另外一方面提升用户体验感。
4.fragment的生命周期大体上和activity一致,但是前期和后期多了一些东西,因为fragment内部有view,那么这个view需要进行创建、然后添加到activity内部,所以相应的在onCreate与onStart之间就多了几个方法-onCreateView、onViewCreated。相同的道理,fragment的view与activity解绑,也相应的在onStop与onDestory之间多个方法-onDestroyView。onAttach与onDetach可以理解为视图与activity产生关联和接触关联,是最开始和最后的步骤。

Demo地址

热点内容
centos66安装ftp 发布:2025-08-02 14:14:35 浏览:366
httpsget加密 发布:2025-08-02 14:07:41 浏览:205
手机存储卡不能写入 发布:2025-08-02 14:01:11 浏览:26
weblogiclinux安装 发布:2025-08-02 13:59:41 浏览:569
vivo手机为什么不能设置锁屏密码 发布:2025-08-02 13:52:05 浏览:645
php二进制加密 发布:2025-08-02 13:51:04 浏览:282
水强行压缩 发布:2025-08-02 13:37:23 浏览:990
nginx内网访问 发布:2025-08-02 13:35:06 浏览:31
如何用解压密码解压手机文件 发布:2025-08-02 13:32:56 浏览:217
lex制作编译器 发布:2025-08-02 13:31:52 浏览:7