【Android應用開發技術:應用組件】Fragment基本原理

來源:互聯網
上載者:User

標籤:

郭孝星
微博:郭孝星的新浪微博
郵箱:[email protected]
部落格:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells

如果我們的App設計成要支援範圍廣泛的螢幕尺寸時,在可利用的螢幕空間內,我們可以通過在不同的布局配置中重用你的Fragment來最佳化我們的使用者體驗。一個手機裝置可能適合一次只有一個Fragment的單面板使用者互動。相反,在更大螢幕尺寸的平板電腦上,我們可能更想要兩個Fragment並排在一起,用來向使用者展示更多資訊。

如所示:

Fragment是Activity模組化的一部分,它擁有自己的生命週期,接收自己的輸入事件,可以在Activity運行中被添加和移除,也可以被多個Activity所複用。

一 Fragment的特性

總的說來,Fragment具備以下特性:

  • Fragment總是作為Activity介面的組成部分,Fragment可調用getActivity()方法擷取它所在的Activity;Activity可以通過FragmentManager的findFragmentById()方法或者findFragmentByTag()方法來擷取相應的Fragment。
  • 在Activity運行過程中,可以通過FragmentManager的add()、remove()和replace()方法來添加、刪除或替換Fragment。
  • 一個Activity可以同時使用多個Framework,同一個Fragment也可以被多個Activity所複用。
  • Fragment可以響應自己的輸入事件,並有自己的生命週期,但是Fragment的生命週期直接被它所屬的Activity所控制。
二 Fragment的生命週期和回調方法Fragment的生命週期

Fragment的生命週期如所示:

  • 活動狀態:當前Fragment位於前台,使用者可見,可以獲得焦點。
  • 暫停狀態:其他Activity位於前台,Fragment依然可見,只是不能獲得焦點。
  • 停止狀態:Fragment不可見,失去焦點。
  • 銷毀狀態:Fragment被完全刪除,或者該Fragment所在的Activity被結束。
Fragment的回調方法

Fragment的回調方法如所示:

  • onAttach():當Fragment被添加到Activity時被回調,該方法只會被調用一次。
  • onCreate():系統建立Fragment對象後回調該方法,實現代碼中只初始化需要在Fragment中保持的必要組件,當Fragment被暫停或者停止後可以恢複。該方法只會被調用一次。
  • onCreateView():當Fragment繪製介面組件時會回調該方法,該方法返回一個View,這個View就是Fragment所顯示的View。
  • onActivityCreated():當Fragment所在的Activity啟動完成後回調該方法。
  • onResume():恢複Fragment時被回調,onStart()調用之後一定會調用onResume()方法。
  • onPause():當使用者離開該Fragment時會回調該方法。
  • onDestory():銷毀Fragment時被回調,該方法只會被調用一次。
  • onDetach():將該Fragment從Activity中刪除,被替換完成時會回調該方法,onDestory()方法調用後一定會回調onDetach()方法,該方法只會被調用一次。

下面我們通過一個例子來示範Fragment的生命週期和回調方法的調用過程。

主程式介面如下所示:

自訂的Fragment的各個回調方法都加入了列印來觀察回調方法的變化情況,源碼如下所示:

Fragment生命週期與回調方法示範用例下載

LifecycleFragment源碼

package org.crazyit.app;import android.app.Activity;import android.app.Fragment;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class LifecycleFragment extends Fragment{    final String TAG = "LifecycleFragment";    @Override    public void onAttach(Activity activity)    {        super.onAttach(activity);        // 輸出日誌        Log.d(TAG, "-------onAttach------");    }    @Override    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        // 輸出日誌        Log.d(TAG, "-------onCreate------");    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle data)    {        // 輸出日誌        Log.d(TAG, "-------onCreateView------");        TextView tv = new TextView(getActivity());        tv.setGravity(Gravity.CENTER_HORIZONTAL);        tv.setText("測試Fragment");        tv.setTextSize(40);        return tv;    }    @Override    public void onActivityCreated(Bundle savedInstanceState)    {        super.onActivityCreated(savedInstanceState);        // 輸出日誌        Log.d(TAG, "-------onActivityCreated------");    }    @Override    public void onStart()    {        super.onStart();        // 輸出日誌        Log.d(TAG, "-------onStart------");    }    @Override    public void onResume()    {        super.onResume();        // 輸出日誌        Log.d(TAG, "-------onResume------");    }    @Override    public void onPause()    {        super.onPause();        // 輸出日誌        Log.d(TAG, "-------onPause------");    }    @Override    public void onStop()    {        super.onStop();        // 輸出日誌        Log.d(TAG, "-------onStop------");    }    @Override    public void onDestroyView()    {        super.onDestroyView();        // 輸出日誌        Log.d(TAG, "-------onDestroyView------");    }    @Override    public void onDestroy()    {        super.onDestroy();        // 輸出日誌        Log.d(TAG, "-------onDestroy------");    }    @Override    public void onDetach()    {        super.onDetach();        // 輸出日誌        Log.d(TAG, "-------onDetach------");    }}
第一次點擊載入目標Fragment

進入應用後,我們首先點擊載入目標Fragment,我們會發現Fragment會先onAttach()添加到當前Activity,建立完成後調用onResume(),函數調用鏈如所示:

第二次點擊載入目標Fragment

當我們再次點擊載入Fragment時,原來的Fragment會被銷毀,新的Fragment會被建立,函數調用鏈如下所示:

點擊啟動對話方塊風格的Activity

當Fragment已經建立,我們再去點擊啟動對話方塊風格的Activity,對話方塊啟動後,Activity處於Pause狀態,那麼從屬於它的Fragment自然也會處於Pause狀態,如所示:

當對話方塊退出後,Activity恢複,Fragment也隨之恢複,如所示:

點擊替換目標Fragment並加入Back棧

當我們點擊替換目標Fragment並加入Back棧,此時Fragment雖然不可見,但是沒有被銷毀,它只是被添加到背景Back棧,如所示:

當使用者按下back鍵時,加入到Back棧的Fragment會再次顯示出來,如所示:

點擊退出

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

【Android應用開發技術:應用組件】Fragment基本原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.