1. 程式人生 > >Fragment進階篇之Fragment生命週期和回退棧

Fragment進階篇之Fragment生命週期和回退棧



前言

上一篇blog(處女男學Android(八)---Fragment初體驗之實現Tab導航)記錄了fragment的基本概念和基本的使用方法,本篇將逐步深入記錄關於fragment的幾個重要知識點,包括:fragment的生命週期、fragment的back stack(回退棧)等等,下面就從fragmeng的生命週期說起。

一、fragment生命週期概述

與Activity類似,Fragment作為一個容器也必定有它自己的生命週期,如果能熟練掌握一個fragment從建立到銷燬過程中的每一個方法,以及它們的呼叫時機,那麼我們將可以更好的去管理一個fragment,比如我們可以根據需求,在不同的狀態中做一些有用的事情,下面看一下官方給出的流程圖:


下面對這11個方法做一下大致的解釋。

onAttach(Activity activity)

---Called when the fragment has been associated with the activity (the  is passed in here).

---當該fragment被新增到Activity時回撥,該方法只會被呼叫一次。

onCreat(Bundle savedInstanceState)

---建立fragment時被回撥。該方法只會呼叫一次。

onCreatView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState

)

---Called to create the view hierarchy associated with the fragment.

---每次建立、繪製該fragment的View元件時回撥該方法,fragment將會顯示該方法的View元件。

onActivityCreated(Bundle savedInstanceState)

---Called when the activity'smethod has returned.

---當fragment所在的Activity被建立完成後呼叫該方法。

onStart()

---

啟動fragment時被回撥。

onResume()

---恢復fragment時被回撥,onStart()方法後一定會回撥onResume()方法。

onPause()

---暫停fragment時被回撥。

onStop()

---停止fragment時被回撥。

onDestroyView()

---Called when the view hierarchy associated with the fragment is being removed.

---銷燬該fragment所包含的View元件時呼叫。

onDestory()

---銷燬fragment時被回撥,該方法只會被呼叫一次。

onDetach()

---Called when the fragment is being disassociated from the activity.

---當該fragment從Activity中被刪除、被替換完成時回撥該方法,onDestory()方法後一定會回撥onDetach()方法。該方法只會被呼叫一次。

其實學習生命週期最好的方法還是在程式中通過列印語句來觀察每個階段的狀態和順序,下面就通過一個簡單的例子來看一下一個fragment完整的生命週期的過程。

二、一個簡單的例子

Layout程式碼(fragment.xml):

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="vertical">
  6.     <TextView
  7.         android:layout_width="match_parent"
  8.         android:layout_height="30dp"
  9.         android:background="#FFCC00"
  10.         android:gravity="center"
  11.         android:text="TextView2 in Fragment"/>
  12.     <ListView
  13.         android:layout_width="fill_parent"
  14.         android:layout_height="wrap_content"
  15.         android:entries="@array/heros">
  16.     </ListView>
  17. </LinearLayout>

MyFragment程式碼:

  1. package com.example.fragmentlifecycledemo;  
  2. import android.app.Activity;  
  3. import android.app.Fragment;  
  4. import android.os.Bundle;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. public class MyFragment extends Fragment {  
  9.     private final String TAG = "--MyFragment--> ";  
  10.     @Override  
  11.     public void onAttach(Activity activity) {  
  12.         // TODO Auto-generated method stub  
  13.         System.out.println(TAG + "onAttach");  
  14.         super.onAttach(activity);  
  15.     }  
  16.     @Override  
  17.     public void onCreate(Bundle savedInstanceState) {  
  18.         // TODO Auto-generated method stub  
  19.         System.out.println(TAG + "onCreate");  
  20.         super.onCreate(savedInstanceState);  
  21.     }  
  22.     @Override  
  23.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  24.             Bundle savedInstanceState) {  
  25.         // TODO Auto-generated method stub  
  26.         System.out.println(TAG + "onCreateView");  
  27.         View view = inflater.inflate(R.layout.fragment, null);  
  28.         return view;  
  29.     }  
  30.     @Override  
  31.     public void onActivityCreated(Bundle savedInstanceState) {  
  32.         // TODO Auto-generated method stub  
  33.         System.out.println(TAG + "onActivityCreated");  
  34.         super.onActivityCreated(savedInstanceState);  
  35.     }  
  36.     @Override  
  37.     public void onStart() {  
  38.         // TODO Auto-generated method stub  
  39.         System.out.println(TAG + "onStart");  
  40.         super.onStart();  
  41.     }  
  42.     @Override  
  43.     public void onResume() {  
  44.         // TODO Auto-generated method stub  
  45.         System.out.println(TAG + "onResume");  
  46.         super.onResume();  
  47.     }  
  48.     @Override  
  49.     public void onPause() {  
  50.         // TODO Auto-generated method stub  
  51.         System.out.println(TAG + "onPause");  
  52.         super.onPause();  
  53.     }  
  54.     @Override  
  55.     public void onStop() {  
  56.         // TODO Auto-generated method stub  
  57.         System.out.println(TAG + "onStop");  
  58.         super.onStop();  
  59.     }  
  60.     @Override  
  61.     public void onDestroyView() {  
  62.         // TODO Auto-generated method stub  
  63.         System.out.println(TAG + "onDestroyView");  
  64.         super.onDestroyView();  
  65.     }  
  66.     @Override  
  67.     public void onDestroy() {  
  68.         // TODO Auto-generated method stub  
  69.         System.out.println(TAG + "onDestroy");  
  70.         super.onDestroy();  
  71.     }  
  72.     @Override  
  73.     public void onDetach() {  
  74.         // TODO Auto-generated method stub  
  75.         System.out.println(TAG + "onDetach");  
  76.         super.onDetach();  
  77.     }  
  78. }  

可以看到上面的程式碼是fragment類和它所要載入的佈局檔案,並在fragment中聲明瞭生命週期中的每個方法以及列印語句。fragment的佈局檔案很簡單,只有一個TextView和一個固定內容的ListView。下面看看Activity的程式碼和佈局檔案。

Layout程式碼(activity_main.xml):

  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4. 相關推薦

    FragmentFragment生命週期退

    前言 上一篇blog(處女男學Android(八)---Fragment初體驗之實現Tab導航)記錄了fragment的基本概念和基本的使用方法,本篇將逐步深入記錄關於fragment的幾個重要知識點,包括:fragment的生命週期、fragm

    Android Fragment(三)---生命週期退

    Fragment生命週期 與Activity類似,Fragment也存在如下狀態。 執行狀態:當前Fragment位於前臺,使用者可見,可以獲得焦點。 暫停:其他Activity位於前臺,該Fragment依然可見,只是不能獲得焦點。 停止狀態:該

    Java十五 ----- JDK1.8的Lambda、Stream日期的使用詳解(很詳細)

    前言 本篇主要講述是Java中JDK1.8的一些新語法特性使用,主要是Lambda、Stream和LocalDate日期的一些使用講解。 Lambda Lambda介紹 Lambda 表示式(lambda expression)是一個匿名函式,Lambda表示式基於數學中的λ演算得名,直接對應於

    (十二)vue.js元件——元件通訊(3)

    (1)概述 所謂元件間的通訊,實際上就是指在各個元件間,進行引數或者資訊的相互傳遞。比如我們前面學的通過props給子元件傳參,實際上這就是父元件向子元件進行單向的通訊。 (2)元件間通訊的幾種方式 1.父到子的通訊 父到子的通訊使用我們前面使用的props即可

    Android引導頁系列ViewPager實現Animation動畫引導頁

    小夥伴們,時隔很久,我又開始來BB了,勿噴,,今天繼續上次所說的引導頁之旅。 其實想實現一個靜態的引導頁還是很容易的,就是一個ViewPager,但是想對每一頁實現動畫效果,比如第一頁有一幾朵雲在飄啊飄!,想實現這種效果對只要瞭解過Animation動畫的人來說也不難實現。

    Jenkins外掛開發擴充套件外掛功能

    之前寫過一篇文章是關於如何開發jenkins外掛,主要講述了開發jenkins外掛時需要準備的環境,如何新建一個jenkins外掛工程,以及對工程專案目錄結構的解析。本文是jenkins外掛開發的進階篇,主要講述如何擴充套件jenkins外掛的功能。如下圖所示:(1)Job任

    Three.js2

    動畫原理 在這裡,我們將動態畫面簡稱為動畫(animation)。正如動畫片的原理一樣,動畫的本質是利用了人眼的視覺暫留特性,快速地變換畫面,從而產生物體在運動的假象。而對於Three.js程式而言,動畫的實現也是通過在每秒中多次重繪畫面實現的。 為了衡量畫面切換速度

    go語音接口的定義實現以及接口的繼承

    結果 只有一個 brush 接口 pack amp nbsp add range 1、接口的定義和實現以及接口的繼承 示例: package main import "fmt" //定義接口類型 type Humaner interface { /

    Three.js7

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> body {margin: 0;} body, html {overflow: hidden

    Android引導頁系列Splash閃屏Log

    最近比較閒,所以會陸續出很多基礎型Demo和高階點的Demo,,小夥伴們肯定又要罵了,孫子又來裝B了 在android應用中,其實閃屏是一個很重要的前期 先上效果圖:就是一個頁面,沒有Logo和公司名幾乎就是一張背景,又要捱罵了 很重要?,這不廢話嗎,不重要為什麼每個應用

    反射應用自定義反射工具類在springmvc中的應用

    本篇使用自定義工具類進行批量處理物件 ---將批量源物件的屬性值注入到實際需要的目標類物件(屬性名相同,型別不同)中 專案使用maven構建war工程:  spring+spring MVC+Mybatis 回顧知識點: 事務:--->為什麼在使用AOP時需要使

    AndroidListView、GridView以及ScrollView實現按鈕控制滾動

    這次還是一樣,因為專案需要,需要對滾動檢視需要手動控制,也就是點選上下左右按鈕,能讓滾動控制元件觸發對應的操作 在android中,滾動View最基本的有三種,分別是:ListView、GridView和ScrollView 先看效果圖:1、ListView的效果圖,右下角

    Data binding 入坑筆記二雙向繫結

    上一篇介紹了Data binding的基礎用法,你可能會想這也太基礎了,只支援前置資料的繫結,一旦資料變化了UI都監聽不到。不要著急,這一篇就來講到databinding的雙向繫結用法。 0.舉個例子 我們用一個輸入控制元件EditText和一個

    Netty簡單版websocket發訊息(7)

    序言:簡單開發前端傳送訊息,後端接收訊息並返回。 1、故事牽引 今天通過一個故事來講解netty,主要講client和ser

    Nettywebsocket傳送訊息(8)

    序言:Netty進階篇之簡單版websocket發訊息(7) 大概和下面的程式碼就成相似,如果不懂,可以看一下這篇部落格

    《手把手教你》系列1-python+ selenium自動化測試 - python基礎掃盲(詳細教程)

    1. 簡介   如果你從一開始就跟著巨集哥看部落格文章到這裡,基礎篇和練習篇的文章。如果你認真看過,並且手動去敲過每一篇的指令碼程式碼,那邊恭喜你,至少說你算真正會利用Python+Selenium編寫自動化指令碼了,你基本掌握了Selenium中webdriver的大部分常用的方法函式。有大佬曾經說過,自動

    《手把手教你》系列2-python+ selenium自動化測試 - python基礎掃盲(詳細教程)

    1. 簡介   這篇文章主要是分享講解一下,如何封裝自己用到的方法和類。以便方便自己和別人的呼叫,這樣就可以避免重複地再造輪子。   封裝(Encapsulation)是面向物件的三大特徵之一(另外兩個是繼承和多型),它指的是將物件的狀態資訊隱藏在物件內部,不允許外部程式直接訪問物件內部資訊,而是通過該類所提

    《手把手教你》系列3-python+ selenium自動化測試 - python幾種騷操作你都知道嗎?(詳細教程)

    1. 簡介    這篇文章主要是給小夥伴或者童鞋們介紹和分享 python幾種騷操:讀取配置檔案、獲取根目錄的相對路徑、獲取系統時間和格式化時間顯示、字串切割等等操作。為後邊的自動化框架打下一個結實的基礎。 2. Python讀取配置檔案內容   本文來介紹下Python中如何讀取配置檔案

    Spring CloudEureka原理分析

    前言 之前寫了幾篇Spring Cloud的小白教程,相信看過的朋友對Spring Cloud中的一些應用有了簡單的瞭解,寫小白篇的目的就是為初學者建立一個基本概念,讓初學者在學習的道路上建立一定的基礎。 從今天開始,我會持續更新幾篇Spring Cloud的進階教程。 Eureka簡介 Eu

    《手把手教你》系列4-python+ selenium自動化測試 - python幾種超神操作你都知道嗎?(詳細教程)

    1. 簡介    今天分享和講解的超神操作,對於菜鳥來說是超神的操作,對於大佬來說也就是幾個簡單方法的封裝和呼叫。這裡講解和分享這部分主要是為了培養小夥伴們和童鞋們的面向物件的開發思維,對比這樣做的好處讓你自己身臨其境的感受一番。 2. 自定義封裝一個簡單的Log類   本文介紹如何寫一個