【Android基礎】Fragment 詳解之Fragment生命周期

2021-03-02 程式設計師互動聯盟

Fragment的主要功能就是創建一個View,並且有一個生命周期來管理這個View的創建和銷毀。Fragment的生命周期與Activity的生命周期類似,都會有一些回調方法,你所做的工作就是利用好這些生命周期方法,在恰當的方法中做恰當的工作。

Fragment的生命周期與Activity的狀態圖如下:


左側是Activity的生命周期狀態,右側對應的是這個狀態下回執行Fragment的哪些生命周期方法。可以看到Fragment生命周期函數與Activity生命周期函數很多名字都是一樣的,對應的功能也類似,只不過在Created狀態和Destroyed狀態比Activity增加了一些方法。下面就說一下這幾個增加的生命周期方法:

與Activity類似,Fragment可以停留(長時間存在)的三個狀態:

與Activity類似,你可以利用Bundle來記錄Fragment的狀態,當Activity被銷毀需要記錄Fragment狀態,並且在Activity重新創建的時候恢復Fragment的狀態。你可以保存Fragment的狀態在Fragment的onSaveInstanceState()回調方法中,在onCteat()、onCreatView()或者onActivityCreated()方法中進行恢復。

在生命周期中Activity與Fragment的最大不同之處是回退棧是相互獨立的,Activity的回退棧是系統來管理的,Fragment的回退棧是被宿主Activity來管理的,也就是說你可以來進行控制(調用addToBackStack()).

注意:在Fragment中你如果要獲取一個Context對象,你可以調用getActivity()方法,但是調用getActivity()方法必須要在Fragment於Activity關聯起來之後,否則getActivity()返回為null。

上面說的都是Fragment的一些生命周期相關知識,下面來看看如何創建Fragment並且添加一個View給Fragment。

要想給Fragment添加一個View,你就必須重寫onCreateView方法,在這個方法中創建一個View並且返回,這個View是Fragment的根View。在這個方法中系統給你提供了LayoutInflater對象,通過這個對象你可以從xml文件中創建一個View,代碼如下:

publicstaticclassExampleFragmentextendsFragment{ @Override publicView onCreateView(LayoutInflaterinflater,ViewGroupcontainer, BundlesavedInstanceState){ // Inflate the layout for this fragment returninflater.inflate(R.layout.example_fragment,container,false); } }

在onCreatView方法中container參數是一個ViewGroup,這個ViewGroup是從Activity傳遞過來的,是Fragment的View將要嵌入的那個父View。這裡需要注意一下LayoutInflater的inflate函數,在這裡第三個參數是false。

在這解釋一下inflate的三個參數含義:

resource:是所要解析的layout文件ID;

root:一個ViewGroup,attachToRoot為true時會作為從xml文件解析出來的view的根View,如果attachToRoot為false時僅僅提供一些布局的參數給返回的rootView;

attachToRoot:決定解析的view是否會綁定到root參數提供的view上。

以上就是Fragment的生命周期和如何創建一個Fragment的View。

關注微信公眾號:程式設計師互動聯盟(coder_online)

更有(java/C/C++/Linux/Android)高手幫你解決難題,和你互動,討論編程未來。

長按二維碼識別關注程式設計師互動聯盟


關注後和技術大牛做朋友,還不趕快來!

聲明:本文使用的圖片部分來自網絡

相關焦點

  • 學習安卓開發[2]-在Activity中託管Fragment
    在上一篇學習安卓開發[1]-程序結構、Activity生命周期及頁面通信中,學習了Activity的一些基礎應用,基於這些知識,可以構建一些簡單的APP了,但這還遠遠不夠,本節會學習如何使用Activity託管Fragment的方式來進行開發
  • Fragment 番外篇——TabLayout+ViewPager+Fragment
    <android.support.design.widget.TabLayout        android:id="@+id/tab_layout"        android:layout_width="match_parent"        android:layout_height="wrap_content"
  • 關於Fragment你所需知道的一切
    事實上,若需要在一個應用中加入 Fragment,只需要將原來的 Activity 替換為 Fragment,並將 Activity 的生命周期回調方法簡單地改為 Fragment 的生命周期回調方法即可。
  • 帶你解鎖Fragment 間通信的新方式
    ,當 Fragment 的生命周期處於 STARTED 時接受數據。如果監聽 Fragment 的生命周期,您可以在接收到新數據時安全地更新 UI,因為 view 的創建(onViewCreated() 方法在 onStart() 之前被調用)。當生命周期處於 LifecycleOwner STARTED 的狀態之前,如果有多個數據傳遞,只會接收到最新的值:
  • 【譯】2020 年 Fragment 最新文檔(上),該更新知識庫啦
    每個可能的生命周期狀態都在  Lifecycle.State 枚舉中表示:通過在 Lifecycle 之上構建 Fragment,您可以使用 可感知生命周期組件 處理生命周期。例如,您可以使用生命周期感知組件在屏幕上顯示設備的位置。
  • Android Fragment+ViewPager 組合,一些你不可不知的注意事項
    When pages are not visible to the user, their entire fragment may be destroyed, only keeping the saved state of that fragment.
  • 2020 年 Fragment 最新文檔(下),該更新知識庫啦
    首次實例化 ViewModel 之後,使用 activity 作用域獲取 ViewModel 將始終返回相同的現有 ViewModel 實例和現有數據,直到 activity 的生命周期永久結束。在父 fragment 和子 fragment 間共享數據 使用子 fragment 時,您的父 fragment 及其子 fragment 可能需要彼此共享數據。
  • 錯誤終結者:Fragment在ViewPager中的正確應用
    在fragmentManager中試圖找到一個Fragment的實例Fragment fragment = mFragmentManager.findFragmentByTag(name);// 如果找到,直接調用attachif(fragment !
  • Kotlin項目實戰之手機影音---悅單條目實現及BaseListFragment抽取
    悅單條目自定義及界面適配:闡述:距離上一次Kotlin項目實戰之手機影音---首頁mvp重構、網絡框架封裝、重構首頁數據加載、home頁面view
  • fragment design x Starbucks 藤原浩又出星巴克聯名了!
    裡原宿教父藤原浩與星巴克幾乎每年都會推出的聯名系列,今年份的fragment design x Starbucks於周二,正式在日本發布,並確定將於6月7日、6月24日分別發售兩套不同的聯名版本。先一步上市的,將是fragment design與星巴克共同推出的首個不鏽鋼巴克杯、同系列保溫杯和星享卡。
  • fragment design x Pokémon聯名!小閃電再度起航
    fragment design x Pokémon閃電系列與2018年10月首次亮相後,今年則又以新面貌問世,藤原浩這位日本潮流教父仿佛有點石成金之力,一個fragment design閃電logo配以人氣動Pokémon就可讓整個潮流界為之一震。
  • OAKLEY與fragment design打造新款聯名眼鏡
    可以任意隨心使用的眼鏡,媒體如此形容並非首度合作的 OAKLEY 與 fragment design 的最新聯名。OAKLEY 成立於 1975 年,從機車握把起家,到戶外運動選手最愛的眼鏡品牌之一,近來也是動作頻頻,之前與日本藝術家山口歷的合作,這次再度與 fragment design 合作推出四款太陽眼鏡,包括 2020 年是 35 周年的 Frogsins,可以稱為是OKALEY最為人熟知的款式,使用 PRIZM 鏡片加強色彩,輕量耐久地 O Matter鏡架,包括藤原浩等一眾創作人都是使用者,也能理解為什麼這次的聯名系列有包括
  • 【資訊】搶先預覽 fragment design x Air Jordan XXXV
    在這一系列合作公布之餘,Nike 亦表示一款全新 fragment design x Air Jordan XXXV 將於 10 月正式登場。在這雙新鞋型上架之前,不妨搶先預覽 fragment design x Air Jordan XXXV 的整體設計。同樣選用黑、白、藍三色作為主調,但這款 fragment design x Air Jordan XXXV 的設計風格卻更偏向低調。
  • 藤原浩曝光fragment design與遊戲《Cyberpunk 2077》全新聯名系列
    財經網生活訊近日,財經網生活由HYPEBEAST獲悉,潮流教父藤原浩(Hiroshi Fujiwara)在個人Instagram上親自曝光了fragment design與《Cyberpunk2077》聯名系列的視頻。有評論稱,藤原浩將時尚和遊戲領域融合在一起,開啟了一個全新世代。
  • 找來fragment design 及 UNDEFEATED,誰這麼大面子?
    本次官方聯名 Medicom Toy 旗下的人氣 BE@RBRICK 玩偶,為了營造話題,fragment design 及 UNDEFEATED 兩大潮流單位參與其中,對於整個單品的影響力提升自然不容小覷。值得關注的是,均以 1000% 尺寸為基礎設計,加持而來的則是高達 70cm 的震撼感。品牌的 Logo 加持其中,自然是購買及收藏的原始動力。
  • Jetpack源碼解析---用Lifecycles管理生命周期
    基礎2.1 簡介Lifecycles是一個持有組件生命周期狀態(如Activity、Fragment)信息的類,並允許其他對象觀察此狀態。可以幫助我們方便的管理Activity和Fragment的生命周期。
  • fragment design x Jordan Brand全系列發布;Travis限定麥當勞套裝...
    滑動查看更多圖片 fragment design x Jordan Brand全新合作系列正式發布 經過了一大輪的曝光,fragment design 與 Jordan Brand 的全新合作系列終於正式發布。
  • android 不同大小的屏幕專題及常見問題 - CSDN
    "/> </LinearLayout> <fragment android:id="@+id/headlines" android:layout_height="fill_parent" android:name="com.example.android.newsreader.HeadlinesFragment
  • 行情艱難,Android初中高級面試題,附詳細答案
    :configChanges時,切屏會銷毀當前Activity,然後重新加載調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次;onPause() →onStop()→onDestory()→onCreate()→onStart()→onResume()設置Activity的android:configChanges="orientation",經過機型測試:設置Activity
  • android啟動頁設計專題及常見問題 - CSDN
    這篇文章主要包括以下兩方面內容 集成騰訊廣告聯盟的SDK 啟動頁加載過程中,後臺初始化數據 我們在設計啟動頁時的常規做法是建立一個Activity來加載開屏圖片或者廣告,作為程序的入口,那麼在這個三到五秒時間內如果進行數據下載,當用戶點擊了跳過按鈕或者計時結束了數據還沒初始化完成,已經進入了主頁面,而主界面剛好需要那些基礎數據該如何?