当前位置:首页 > 移动端开发 > 正文内容

FragmentContainerView、ViewPager、ViewPager2与 BottomNaviagtionView结合运用的差异

邻居的猫1个月前 (12-09)移动端开发813


现在市道的运用界面大多是经过一个Fragment容器+底部导航栏结构来完成页面切换的,而当咱们想要去建立一个这样的结构时,上层的Fragment容器是可选的,常见的有FragmentContanerView、ViewPager、ViewPager2。咱们应该怎么挑选呢?这时就需要考虑这三者的本身自带的一些特性差异:

在我现在写的项目中这三者都有运用到,一开端并没有觉得有什么差异,由于写的都是一些很简单的项目。但在一次运用FragmentContainerView的进程中,我显着的感觉到了其与ViewPager2的一个明显差异:切换Fragment时生命周期办法的调用。

在这个运用FragmentContainerView+BottomNavigationView的项目中,我在其中一个页面加入了自定义的主动轮播图控件,而当我经过底部导航栏切换到另一界面再切回来时,我发现我的轮播图控件总是会主动从第一张图开端加载,而在我之前运用ViewPager2+BottomNaviagtionView的项目中我也运用了主动轮播图控件,可是并没有呈现这个问题:即经过底部导航栏切换到另一个页面再切回来并不会使轮播图控件从头轮播。

我开端考虑:是什么导致了主动轮播图控件每次切回来都会从头开端轮播?

以下是我的排查进程:

一开端,我置疑我的轮播图主动轮播的逻辑写的有问题,回来检查,发现与另一个项目的是相同的,那就能够扫除这个原因

然后,我开端考虑轮播图的加载机遇。我的轮播图数据是网络数据,而恳求轮播图网络数据是在Fragment的onViewCreated()生命周期办法中履行的。也便是说与Fragment的生命周期办法调用机遇有关。

1.FragmentContainerView+BottomNavigationView切换Fragment时的生命周期调用状况:

我开端在Fragment的各个生命周期办法中打Log,然后发现,当我经过底部导航栏切换FragmentContainerView中的fragment时,被切换的Fragment除了主页的Fragment只会当即履行onPause()->onStop()->onDestroyView(),其他的都会当即履行onPause()->onStop()->onDestroyView(onDestory(),当我再切换回来之后,会履行onCreatedView()->onViewCreated()。也便是说每逢我切换回去之后轮播图都会再从头恳求一次数据,然后导致了每次切换回轮播图界面轮播图都会从头开端轮播。

主页Fragment被切换后的生命周期调用状况

从头切回主页Fragment后的生命周期调用状况

其他Fragment被切换后的生命周期调用状况

从头切回其他Fragment后的生命周期调用状况

2.ViewPager2+BottomNavigationView切换Fragment的生命周期调用状况:

然后,我又回来去检查另一个项目(即运用ViewPager2+BottomNavigationView的)的界面切换导致的Fragment生命周期办法的改变。发现:当经过BottomNavigationView切换fragment时,被切换的fragment只会履行onPause(),但并不会当即履行onStop(),而是等候一段时间后或当用户退出运用才会调用onStop()办法;且当切回去时,也不会从头履行onCreatedView()->onViewCreated(),onCreatedView()->onViewCreated()只要当Fragment初度被展现时才会调用。故运用ViewPager2的项目中切换Fragment不会导致轮播图数据从头加载而导致轮播图从头轮播。

Fragment被切换后生命周期调用状况

Fragment被切回来后生命周期调用状况

3.ViewPager+BottomNaviagtionView切换Fragment的生命周期调用状况:

​ 然后,我又研讨了一下ViewPager+BottomNaviagtionView切换fragment的生命周期调用状况。ViewPager有预加载功用,比较复杂一点

​ 相同是只要三个页面(Title,Leaderboard,Register),由BottomNavigationView操控切换:

​ 初度加载时,ViewPager会预加载其接近的一个Fragment,在这个比如中,便是显现主页Title页面时也预加载了Leaderboard页面,生命周期调用如下:


当我从Title切换到接近的Leaderboard页面时,被切换的Title页面的生命周期没有任何改变,切换后的Leaderboard页面也没有任何改变(由于其现已被预加载过了),而此刻,与Leaderboard接近的Register页面也会被预加载,生命周期调用如下:

而当我从Leaderboard页面切换到第三个页面Register时,Leaderboard页面和Register页面的生命周期都不会发生改变,但第一个页面Title会被毁掉,生命周期调用如下:

相同的,当我从第三个页面Register切换到第二个页面Leaderboard时,第一个页面Title又会被从头加载,生命周期调用如下:

当我再从第二个页面Leaderboard切换到第一个界面时,第三个页面Register又会被毁掉,生命周期办法调用如下:

由上述测验咱们能够看到ViewPager的预加载机制和页面毁掉机制,且当界面上只要三个页面时,除非用户退出界面,不然第二个页面是永久不会毁掉的。

4.总结:

(1)FragmentContainerView+BottomNavigationView:

既没有预加载机制也没有缓存机制,每切换一次,被切换的Fragment就会被毁掉,下次切回来要从头创立View:onCreatedView()->onViewCreated()

(2)ViewPager2+BottomNavigationView:

默许是没有预加载机制的,除非咱们手动调用viewPager.offscreenPageLimit 特点进行设置,不然默许是没有预加载(其预加载与ViewPager的预加载机制还不太相同,预加载的界面不会调用onResume()烘托界面,而ViewPager的预加载界面是直接烘托好的),可是默许有缓存机制,当页面被加载到界面上后不会毁掉(除非用户退出界面),只会暂停onPause,再次回来时直接onResume()

(3)ViewPager+BottomNavigationView:

默许有预加载机制,会预加载接近的左右页面。也有默许的缓存机制,但与ViewPager2的不同,当从本页面切换到距离一个的页面,本页面就会被毁掉(如从1切换到3时,1就会被毁掉)。

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=470

分享给朋友:

“FragmentContainerView、ViewPager、ViewPager2与 BottomNaviagtionView结合运用的差异” 的相关文章

Pixel 6a 刷机&root记载

Pixel 6a 刷机&root记载

预备工作 下载出厂镜像包:https://developers.google.com/android/images?hl=zh-cn#bluejay 刷机东西:https://github.com/badabing2005/PixelFlasher Root东西:https://github.com...

iOS开发结构--QMUIKit

iOS开发结构--QMUIKit

深化解析 QMUIKIT:高效的 iOS UI 组件库 QMUIKIT(QMUI)是一个专为 iOS 开发者规划的开源 UI 组件库,旨在提高开发功率与用户体会。本文将从怎么简略运用 QMUI、底层原理、中心组件的完成细节,以及一些最佳实践等方面进行深化探讨。 1. 简略运用 QMUI 1.1 装置...

鸿蒙诀,探寻宇宙奥秘的修炼秘籍

《鸿蒙诀》是一部玄幻类小说,情节跌宕起伏,扣人心弦。以下是关于这部小说的一些详细介绍:1. 《开天鸿蒙诀》: 作者:祥虎 简介:这部小说情节与文笔俱佳,主要讲述了一个充满奇幻色彩的故事。主角在修炼过程中历经重重考验,最终成就非凡。2. 《鸿蒙霸体诀》: 作者:鱼初见 简介:十...

鸿蒙生态,构建全场景、全设备的智能操作系统

鸿蒙生态,构建全场景、全设备的智能操作系统

鸿蒙生态是华为面向全场n HarmonyOS 4:最新版本,具有个性主题、全景天气、万能卡片、小艺助手等创新功能,提升了使用体验和效率。2. 生态应用: HarmonyOS Connect:面向消费领域的智能硬件开放生态,涵盖智能家居、智慧出行、运动健康、智能办公、影音娱乐、教育关怀等...

鸿蒙和安卓有什么区别,鸿蒙系统与安卓系统的区别分析

鸿蒙和安卓有什么区别,鸿蒙系统与安卓系统的区别分析

1. 开发者:鸿蒙由华为开发,而安卓由谷歌开发。2. 开源:鸿蒙是开源的,而安卓在早期是开源的,但后来谷歌对其进行了限制。3. 生态系统:安卓拥有庞大的生态系统,包括大量的应用和设备。鸿蒙的生态系统相对较小,但正在快速发展。4. 兼容性:鸿蒙与安卓的兼容性有限,而安卓与安卓设备之间的兼容性非常好。5...

安卓鸿蒙,操作系统领域的双雄争霸

安卓鸿蒙,操作系统领域的双雄争霸

鸿蒙系统和安卓系统在多个方面存在显著区别,以下是它们的主要区别:1. 开发环境: 安卓系统:基于JDK(Java Development Kit),使用Java语言进行开发,包括Java运行环境JRE、Java工具和Java基础类库等。 鸿蒙系统:通过方舟编译器进行开发,支持多语言统一编...