Carson帶你學Android:Fragment最全面介紹 & 使用方法解析


前言

  • FragmentAndroid開發(fā)中非常常用
  • 今天力九,我將講解關于Fragment的使用

目錄

Fragment介紹&使用方法解析.png

1. 定義

Activity界面中的一部分戴差,可理解為模塊化的Activity

  1. Fragment不能獨立存在藤违,必須嵌入到Activity
  2. Fragment具有自己的生命周期租漂,接收它自己的事件蔗牡,并可以在Activity運行時被添加或刪除
  3. Fragment的生命周期直接受所在的Activity的影響确镊。如:當Activity暫停時臂容,它擁有的所有Fragment們都暫停

2. 作用

支持動態(tài)科雳、靈活的界面設計

  1. FragmentAndroid 3.0后引入
  2. 在低版本Android 3.0前使用 Fragment,需要采用android-support-v4.jar兼容包

3. 生命周期解析

  • 先來看官方說明圖
示意圖

詳解每個方法的調用場景

  • onAttach方法
    Fragment和Activity建立關聯(lián)的時候調用(獲得activity的傳遞的值)
  • onCreateView方法
    為Fragment創(chuàng)建視圖(加載布局)時調用(給當前的fragment繪制UI布局脓杉,可以使用線程更新UI)
  • onActivityCreated方法
    當Activity中的onCreate方法執(zhí)行完后調用(表示activity執(zhí)行oncreate方法完成了的時候會調用此方法)
  • onDestroyView方法
    Fragment中的布局被移除時調用(表示fragment銷毀相關聯(lián)的UI布局)
  • onDetach方法
    Fragment和Activity解除關聯(lián)的時候調用(脫離activity)

Fragment生命周期解析

  • 當一個fragment被創(chuàng)建的時候:
    onAttach()
    onCreate()
    onCreateView()
    onActivityCreated()

  • 當這個fragment對用戶可見的時候糟秘,它會經歷以下狀態(tài)。
    onStart()
    onResume()

1.2可以理解為從創(chuàng)建到顯示(或切換)

  • 當這個fragment進入“后臺模式”的時候球散,它會經歷以下狀態(tài)尿赚。
    onPause()
    onStop()

  • 當這個fragment被銷毀了(或者持有它的activity被銷毀了):
    onPause()
    onStop()
    onDestroyView()
    onDestroy()
    onDetach()

  • 就像Activity一樣,在以下的狀態(tài)中蕉堰,可以使用Bundle對象保存一個fragment的對象凌净。
    onCreate()
    onCreateView()
    onActivityCreated()

其他場景的調用

  • 屏幕滅掉
    onPause() onSaveInstanceState() onStop()

  • 屏幕解鎖
    onStart() onResume()

  • 切換到其他Fragment
    onPause() onStop() onDestroyView()

  • 切換回本身的Fragment
    onCreateView() onActivityCreated() onStart() onResume()

  • 回到桌面
    onPause() onSaveInstanceState() onStop()

  • 回到應用
    onStart() onResume()

  • 退出應用
    onPause() onStop() onDestroyView() onDestroy() onDetach()

Fragment和Activity的生命周期很相似,以下是對比圖


4. 具體使用

  • 由于Fragment作為Activity一部分屋讶,所以Fragment的使用一般是添加到Activity
  • Fragment添加到Activity中一般有2種方法:
    1. Activitylayout.xml布局文件中靜態(tài)添加
    2. Activity.java文件中動態(tài)添加

方法1:在Activitylayout.xml布局文件中靜態(tài)添加

  • Activity的布局文件

fragment_layout_test.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

// 該fragment類定義在包名為"com.skywang.app"中的FragmentLayoutTest類的內部類ExampleFragment中
   <fragment android:name="com.skywang.app.FragmentLayoutTest$ExampleFragment"
        android:id="@+id/list"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
  
</LinearLayout>
  • Fragment的布局文件

example_fragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:text="@string/example_fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
   
</LinearLayout>
  • Activity的.java文件

FragmentLayoutTest.java

// 在Activity使用Fragment時冰寻,需要考慮版本兼容問題
// 1. Android 3.0后,Activity可直接繼承自Activity皿渗,并且在其中嵌入使用Fragment
// 2. Android 3.0前斩芭,Activity需FragmentActivity(其也繼承自Activity)没卸,同時需要導入android-support-v4.jar兼容包,這樣在Activity中才能嵌入Fragment

public class FragmentLayoutTest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_layout_test);
        // 設置上述布局文件
    }

    // 繼承自Fragment
    // 布局文件中的Fragment通過該FragmentLayoutTest的內部類ExampleFragment實現(xiàn)
    public static class ExampleFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            
            return inflater.inflate(R.layout.example_fragment, container, false);
             // 將example_fragment.xml作為該Fragment的布局文件
            // 即相當于FragmentLayoutTest直接調用example_fragment.xml來顯示到Fragment中
        }
    }
}

至此秒旋,方法1講解完畢约计。


方法2:在Activity的.java文件中動態(tài)添加

  • 步驟1:在Activity的布局文件定義1占位符(FrameLayout
    這樣做的好處是:可動態(tài)在Activity中添加不同的 Fragment,更加靈活

fragment_transaction_test.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <FrameLayout
        android:id="@+id/about_fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
</LinearLayout>

  • 步驟2:設置Fragment的布局文件

example_fragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:text="@string/example_fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
   
</LinearLayout>
  • 步驟3:在Activity.java文件中動態(tài)添加Fragment

FragmentTransactionTest


public class FragmentTransactionTest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_transaction_test);
        
        // 步驟1:獲取FragmentManager
        FragmentManager fragmentManager = getFragmentManager();

        // 步驟2:獲取FragmentTransaction        
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        
        // 步驟3:創(chuàng)建需要添加的Fragment :ExampleFragment
        ExampleFragment fragment = new ExampleFragment();

        // 步驟4:動態(tài)添加fragment
        // 即將創(chuàng)建的fragment添加到Activity布局文件中定義的占位符中(FrameLayout)
        fragmentTransaction.add(R.id.about_fragment_container, fragment);
        fragmentTransaction.commit();
    }
    
    // 繼承與Fragment
    public static class ExampleFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            
            return inflater.inflate(R.layout.example_fragment, container, false);
            // 將example_fragment.xml作為該Fragment的布局文件
        }
    }
}

至此迁筛,方法2講解完畢


5. 總結

  • 本文對 Fragment進行了全面介紹和分析
  • Carson帶你學四大組件文章系列:

Carson帶你學Android:頁面活動-Activity
Carson帶你學Android:廣播-BroadcastReceiver
Carson帶你學Android:服務-Service
Carson帶你學Android:內存承載器-ContentProvider


歡迎關注Carson_Ho的簡書

不定期分享關于安卓開發(fā)的干貨煤蚌,追求短、平细卧、快尉桩,但卻不缺深度


請點贊贪庙!因為你的鼓勵是我寫作的最大動力蜘犁!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市止邮,隨后出現(xiàn)的幾起案子这橙,更是在濱河造成了極大的恐慌,老刑警劉巖导披,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屈扎,死亡現(xiàn)場離奇詭異,居然都是意外死亡撩匕,警方通過查閱死者的電腦和手機鹰晨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來止毕,“玉大人模蜡,你說我怎么就攤上這事”饬荩” “怎么了忍疾?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長令漂。 經常有香客問我膝昆,道長丸边,這世上最難降的妖魔是什么叠必? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮妹窖,結果婚禮上纬朝,老公的妹妹穿的比我還像新娘。我一直安慰自己骄呼,他們只是感情好共苛,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布判没。 她就那樣靜靜地躺著,像睡著了一般隅茎。 火紅的嫁衣襯著肌膚如雪澄峰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天辟犀,我揣著相機與錄音俏竞,去河邊找鬼。 笑死堂竟,一個胖子當著我的面吹牛魂毁,可吹牛的內容都是我干的。 我是一名探鬼主播出嘹,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼席楚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了税稼?” 一聲冷哼從身側響起烦秩,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎郎仆,沒想到半個月后闻镶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡丸升,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年铆农,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狡耻。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡墩剖,死狀恐怖,靈堂內的尸體忽然破棺而出夷狰,到底是詐尸還是另有隱情岭皂,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布沼头,位于F島的核電站爷绘,受9級特大地震影響,放射性物質發(fā)生泄漏进倍。R本人自食惡果不足惜土至,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猾昆。 院中可真熱鬧陶因,春花似錦、人聲如沸垂蜗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烘苹,卻和暖如春躲株,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镣衡。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工徘溢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捆探。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓然爆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親黍图。 傳聞我的和親對象是個殘疾皇子曾雕,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容