<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      FragmentContainerView、ViewPager、ViewPager2與 BottomNaviagtionView結合使用的區別


      現在市面的應用界面大多是通過一個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就會被銷毀)。

      posted @ 2024-09-28 14:09  YiLeChen16  閱讀(376)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 汶川县| 爆乳女仆高潮在线观看| 青草99在线免费观看| 艳妇乳肉豪妇荡乳在线观看| 砚山县| 国产毛片三区二区一区| 国产二区三区不卡免费| 个旧市| 久久日韩在线观看视频| 久久久久亚洲A√无码| 漠河县| 亚洲一区精品视频在线| 亚洲国产成人久久精品软件| 一本色道久久东京热| 亚洲综合网中文字幕在线| av在线播放观看国产| 国产四虎永久免费观看| 男女爽爽无遮挡午夜视频| 国产精品无码成人午夜电影| 亚洲欧美日韩国产精品专区| 欧美熟妇xxxxx欧美老妇不卡 | 国产成人午夜福利在线播放| 少妇真人直播免费视频| 九九热在线免费视频观看 | 蜜桃臀av在线一区二区| 国产精品亚欧美一区二区三区| 国产日韩久久免费影院| 国产人妻久久精品一区二区三区| 精品国产中文字幕第一页| 国产永久免费高清在线观看| 97夜夜澡人人爽人人模人人喊| 天天澡天天揉揉av无码| 久久精品国产亚洲精品色婷婷| 男人扒开添女人下部免费视频| 台安县| 亚洲国产欧美一区二区好看电影 | 老司机精品成人无码AV| 亚洲 欧美 动漫 少妇 自拍| 国产丝袜肉丝视频在线| 成人国产av精品免费网| 亚洲日韩国产精品第一页一区|