android fragment

Fragment要點

  1. Fragment作爲Activity界面的一部分組成出現
  2. 可以在一個Activity中同時出現多個Fragment,並且,一個Fragment亦可在多個Activity中使用。
  3. 在Activity運行過程中,可以添加、移除或者替換Fragment(add()、remove()、replace())
  4. Fragment可以響應自己的輸入事件,並且有自己的生命週期,當然,它們的生命週期直接被其所屬的宿主activity的生命週期影響。

設計哲學        

        Android在3.0中引入了fragments的概念,主要目的是用在大屏幕設備上--例如平板電腦上,支持更加動態和靈活的UI設計。平板電腦的屏幕要比手機的大得多,有更多的空間來放更多的UI組件,並且這些組件之間會產生更多的交互。Fragment允許這樣的一種設計,而不需要你親自來管理 viewhierarchy的複雜變化。 通過將activity的佈局分散到fragment中, 你可以在運行時修改activity的外觀,並在由activity管理的back stack中保存那些變化.(http://developer.android.com/guide/topics/fundamentals/fragments.html  

 

         例如, 一個新聞應用可以在屏幕左側使用一個fragment來展示一個文章的列表,然後在屏幕右側使用另一個fragment來展示一篇文章--2個fragment並排顯示在相同的一個activity中,並且每一個fragment擁有它自己的一套生命週期回調方法,並且處理它們自己的用戶輸入事件。 因此, 取代使用一個activity來選擇一篇文章而另一個activity來閱讀文章的方式,用戶可以在同一個activity中選擇一篇文章並且閱讀, 如圖所示:


     fragment在你的應用中應當是一個模塊化和可重用的組件.即,因爲fragment定義了它自己的佈局, 以及通過使用它自己的生命週期回調方法定義了它自己的行爲,你可以將fragment包含到多個activity中. 這點特別重要, 因爲這允許你將你的用戶體驗適配到不同的屏幕尺寸.舉個例子,你可能會僅當在屏幕尺寸足夠大時,在一個activity中包含多個fragment,並且,當不屬於這種情況時,會啓動另一個單獨的,使用不同fragment的activity.

     繼續之前那個新聞的例子 -- 當運行在一個特別大的屏幕時(例如平板電腦),應用可以在Activity A中嵌入2個fragment。然而,在一個正常尺寸的屏幕(例如手機)上,沒有足夠的空間同時供2個fragment用, 因此, Activity A會僅包含文章列表的fragment, 而當用戶選擇一篇文章時, 它會啓動ActivityB,它包含閱讀文章的fragment.因此, 應用可以同時支持上圖中的2種設計模式。


創建Fragment

       要創建一個fragment, 必須創建一個 Fragment 的子類 (或者繼承自一個已存在的它的子類). Fragment類的代碼看起來很像 Activity 。它包含了和activity類似的回調方法, 例如onCreate()、 onStart()、onPause()以及 onStop()。事實上, 如果你準備將一個現成的Android應用轉換到使用fragment,可能只需簡單的將代碼從你的activity的回調方法分別移動到你的fragment的回調方法即可。
    

      通常, 應當至少實現如下的生命週期方法:

  • onCreate()
    當創建fragment時, 系統調用該方法. 
    在實現代碼中,應當初始化想要在fragment中保持的必要組件, 當fragment被暫停或者停止後可以恢復.
  • onCreateView()
    fragment第一次繪製它的用戶界面的時候, 系統會調用此方法. 爲了繪製fragment的UI,此方法必須返回一個View, 這個view是你的fragment佈局的根view. 如果fragment不提供UI, 可以返回null.
  • onPause()
    用戶將要離開fragment時,系統調用這個方法作爲第一個指示(然而它不總是意味着fragment將被銷燬.) 在當前用戶會話結束之前,通常應當在這裏提交任何應該持久化的變化(因爲用戶有可能不會返回).


其生命週期圖如下:


          大多數應用應當爲每一個fragment實現至少這3個方法,但是還有一些其他回調方法你也應當用來去處理fragment生命週期的各種階段.全部的生命週期回調方法將會在後面章節 Handlingthe Fragment Lifecycle 中討論.

      除了繼承基類 Fragment , 還有一些子類你可能會繼承:

 

  • DialogFragment
    顯示一個浮動的對話框.  
    用這個類來創建一個對話框,是使用在Activity類的對話框工具方法之外的一個好的選擇,
    因爲你可以將一個fragment對話框合併到activity管理的fragment back stack中,允許用戶返回到一個之前曾被摒棄的fragment.
  • ListFragment
    顯示一個由一個adapter(例如 SimpleCursorAdapter)管理的項目的列表, 類似於ListActivity.
    它提供一些方法來管理一個list view, 例如 onListItemClick()回調來處理點擊事件.
  • PreferenceFragment
    顯示一個 Preference對象的層次結構的列表, 類似於PreferenceActivity. 
    這在爲你的應用創建一個"設置"activity時有用處.

添加一個用戶界面   

         fragment通常用來作爲一個activity的用戶界面的一部分,並將它的layout提供給activity.爲了給一個fragment提供一 個layout,你必須實現 onCreateView()回調方法, 當到了fragment繪製它自己的layout的時候,Android系統調用它.你的此方法的實現代碼必須返回一個你的fragment的 layout的根view. 
       注意: 如果你的fragment是ListFragment的子類,它的默認實現是返回從onCreateView()返回一個ListView,所以一般情況下不必實現它. 
       從onCreateView()返回的View, 也可以從一個layout的xml資源文件中讀取並生成. 爲了幫助你這麼做, onCreateView() 提供了一個LayoutInflater 對象.

      舉個例子, 這裏有一個Fragment的子類, 從文件 example_fragment.xml 加載了一個layout:

[java] view plaincopy
  1. public static class ExampleFragment extends Fragment {  
  2.     @Override  
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  4.                              Bundle savedInstanceState) {  
  5.         // Inflate the layout for this fragment  
  6.         return inflater.inflate(R.layout.example_fragment, container, false);  
  7.     }  
  8. }  

         傳入onCreateView()的container參數是你的fragmentlayout將被插入的父ViewGroup(來自activity的layout)  savedInstanceState 參數是一個Bundle, 如果fragment是被恢復的,它提供關於fragment的之前的實例的數據,

inflate() 方法有3個參數:

  • 想要加載的layout的resource ID.
  • 加載的layout的父ViewGroup.
    傳入container是很重要的, 目的是爲了讓系統接受所要加載的layout的根view的layout參數,
    由它將掛靠的父view指定.
  • 布爾值指示在加載期間, 展開的layout是否應當附着到ViewGroup (第二個參數).
    (在這個例子中, 指定了false, 因爲系統已經把展開的layout插入到container –傳入true會在最後的layout中創建一個多餘的view group.)

將fragment添加到activity

        通常地, fragment爲宿主activity提供UI的一部分, 被作爲activity的整個viewhierarchy的一部分被嵌入. 有2種方法你可以添加一個fragment到activity layout:

在activity的layout文件中聲明fragment
       在這種情況下,你可以像爲View一樣, 爲fragment指定layout屬性.例子是一個有2個fragment的activity的layout:

 

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