Fragment的瞭解和使用

Fragment的作用::統一管理一部分佈局

1.fragment可以理解爲是activity的一部分.

2.在一個activity當中使用多個fragment來構建UI

3.可以複用一個fragmeng在多個activity中使用

4.fragment有它自己的生命週期

5.一個fragment必須總是嵌入到activity中,生命週期受activity影響

6.當activity處於失去焦點的時候(Pause), fragment也會處於失去焦點的狀態

7.fragment存活於ViewGroup當中


Fragment的生命週期

[1]使用Fragment必須重寫onCreateView方法
[2]還可以重寫一個ondestroy方法 做一些收尾的工作
● onStart:當到OnStart()時,Fragment對用戶就是可見的了。但用戶還未開始與Fragment交互。在生命週期中也可以看到Fragment的OnStart()過程與Activity的OnStart()過程是綁定的。意義即是一樣的。以前你寫在Activity的OnStart()中來處理的代碼,用Fragment來實現時,依然可以放在OnStart()中來處理。
● onResume:當這個fragment對用戶可見並且正在運行時調用。這是Fragment與用戶交互之前的最後一個回調。從生命週期對比中,可以看到,Fragment的OnResume與Activity的OnResume是相互綁定的,意義是一樣的。它依賴於包含它的activity的Activity.onResume。當OnResume()結束後,就可以正式與用戶交互了。
● onPause:此回調與Activity的OnPause()相綁定,與Activity的OnPause()意義一樣。
● onStop:這個回調與Activity的OnStop()相綁定,意義一樣。已停止的Fragment可以直接返回到OnStart()回調,然後調用OnResume()。
● onDestroyView:如果Fragment即將被結束或保存,那麼撤銷方向上的下一個回調將是onDestoryView()。會將在onCreateView創建的視圖與這個fragment分離。下次這個fragment若要顯示,那麼將會創建新視圖。這會在onStop之後和onDestroy之前調用。這個方法的調用同onCreateView是否返回非null視圖無關。它會潛在的在這個視圖狀態被保存之後以及它被它的父視圖回收之前調用。
● onDestroy:當這個fragment不再使用時調用。需要注意的是,它即使經過了onDestroy()階段,但仍然能從Activity中找到,因爲它還沒有Detach。
● onDetach:Fragment生命週期中最後一個回調是onDetach()。調用它以後,Fragment就不再與Activity相綁定,它也不再擁有視圖層次結構,它的所有資源都將被釋放。


fragment佈局的加載和定義:

1.通過佈局加載(基本不怎麼用)
在主activity的佈局文件中通過標籤來定義fragment的樣式,然後單獨定義一個自己需要的具體的fragment佈局的細節xml文件,在主xml中通過引入,然後在具體的類中通過繼承Fragment類進行加載剛纔定義好的xml佈局,裏面覆寫onCreateView方法。
//name屬性 要指定我們自己定義的fragment

2.通過在代碼中動態加載


使用fragment兼容低版本的寫法

[1]定義fragment繼承V4包中的Fragment
[2]定義的activity要繼承v4包中的FragmentActivity
[3]通過這個方法getSupportFragmentManager 獲取Fragment的管理者


Fragment的靜態和動態的使用

靜態的使用方式:
①以xml佈局形式自定義需要的fragment的樣式
②然後通過自定義類繼承Fragment,覆寫onCreateView()方法,在裏面渲染剛纔自定義的 fragment佈局,那麼當前這個自定義的類就是一個Fragment,
③然後在main_layout.xml佈局中需要使用這個fragment的時候,直接在main_layout.xml佈局文件中通過標籤加入一個fragment 控件,用name屬性指向剛纔的自定義Fragment類(例如下面的xml代碼),那麼Mainactivity中就會有一個fragment

<fragment
    android:id="@+id/frag1"
     android:name="com.example.sj.fragmentdemo1.Fragment1"
     android:layout_width="match_parent"
     android:layout_height="200dp"/>

動態的使用方式:
①以xml佈局形式自定義需要的fragment的樣式
②然後通過自定義Fragment類,和靜態的使用方式前面一樣,通過覆寫onCreateView()方法加載剛纔自定義好的fragment的xml佈局。那麼當前的這個Fragment類就是一個可以使用的Fragment控件。
③在主函數對應的xml佈局文件中添加一個作爲目標位置,用來將自定義好的Fragment對象添加到該控件上顯示出來
④在MainActivity中實例化剛纔自定義的Fragment自定義類,並且需要FragmentManager mFragmentManager= this.getFragmentManager(),然後通過管理器來開啓一個事物FragmentTransaction transaction = mFragmentManager.beginTransaction();
⑤在開啓了一個事物後,可以進行一些具體的事物操作,事物包含了下面知識點4中的那些操作
⑥通過事物,把實例化出來的Fragment對象添加(或者其他操作)到主函數xml佈局中的位置
參數內容: transaction.add(R.id.目標位置,Fragment對象,唯一的標識);
transaction.add(R.id.des,mFragment2,”xx2”);
transaction.add(R.id.des,mFragment3,”xx3”);
ransaction.add(R.id.des,mFragment1,”xx1”);
⑦提交事物。 transaction.commit();


動態添加Fragment主要分爲4步:

● 1.獲取到FragmentManager,在V4包中通過getSupportFragmentManager,在系統中原生的Fragment是通過getFragmentManager獲得的。
● 2.開啓一個事務,通過調用beginTransaction方法開啓。
● 3.向容器內加入Fragment,一般使用add或者replace方法實現,需要傳入容器的id和Fragment的實例。
● 4.提交事務,調用commit方法提交。


事物管理

add 將Fragment對象添加到指定位置(不能重複添加)
remove 將Fragment對象從指定位置移除,此操作將會銷燬Fragment對象的結構和視圖
replace 替換 效果=remove+add
hide 將當前Fragment對象隱藏,Fragment對象依舊存在
show 讓隱藏重現
detech 銷燬視圖結構 : 一方面刪除fragment的View視圖;一方面將fragment從Activity的ADD隊列中移除
attech 重構視圖結構 :重新構建了fragment的View視圖,並且將fragment添加到了ADD隊首位置

add remove 與 hide和show attech和detech間的區別

他們都能實現看得見—>看不見—>看得見

性能消耗和內存處理上不同
remove 指的是完全銷燬fragment對象的全部構造數據

hide 關於內存中的數據什麼都不動,只是變得看不見了而已
detech 只是把視圖部分銷燬,其他數據還在


Fragment的管理:

1.FragmentManager

要管理activity中的fragments,你就需要使用FragmentManager。通過getFragmentManager()或 getSupportFragmentManager()獲得
常用的方法有:
manager.findFragmentById(); //根據ID來找到對應的Fragment實例,主要用在靜態添加fragment的佈局中,因爲靜態添加的fragment纔會有ID
manager.findFragmentByTag();//根據TAG找到對應的Fragment實例,主要用於在動態添加的fragment中,根據TAG來找到fragment實例
manager.getFragments(); //獲取所有被ADD進Activity中的Fragment

通過Tag去找到對應的Fragment實例,然後進行具體的操作管理:
隱藏hide:

FragmentManager manager = getSupportFragmentManager();  
Fragment fragment = manager.findFragmentByTag("fragment3");  
FragmentTransaction transaction = manager.beginTransaction();  
transaction.hide(fragment);  
transaction.addToBackStack("hide fragment3");  
transaction.commit(); 

展示show:

FragmentManager manager = getSupportFragmentManager();  
Fragment fragment = manager.findFragmentByTag("fragment3");  
FragmentTransaction transaction = manager.beginTransaction();  
transaction.show(fragment);  
transaction.addToBackStack("show fragment3");  
transaction.commit();

2、FragmentTransaction

一般用來對當前的Fragment進行管理,包括add,replace,remove;
常用的針對Fragment的方法有:

//將一個fragment實例添加到Activity的最上層
add(int containerViewId, Fragment fragment, String tag);

//將一個fragment實例從Activity的fragment隊列中刪除
remove(Fragment fragment);

//替換containerViewId中的fragment實例,注意,它首先把containerViewId中所有fragment刪除,然後再add進去當前的fragment
replace(int containerViewId, Fragment fragment);


Fragment的回退棧操作

通過一個Fragment對象上的按鈕事件去開啓另外一個Fragment,該按鈕的功能需要在它存在的Fragment對象中去實例化並且添加點擊事件,操作如下:

FragmentManager fragmentManager = this.getFragmentManager(); //獲取Fragment管理器
FragmentTransaction transaction = fragmentManager.beginTransaction(); //開啓一個事物
transaction.add(R.id.root_layout,new Fragment2(),”xx1”); //將Fragment2對象添加到顯示位置(因爲顯示位置定義的是幀佈局,所以後添加的會擋住前面添加的)

transaction.addToBackStack(null); //加入回退棧,只有添加了這行命令,在點擊back鍵的時候纔會返回到之前的Fragment界面位置,纔不會直接將程序onDestroy。
transaction.commit(); //提交事物

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章