Android之Fragment(上)

來源:互聯網
上載者:User
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的生命週期

   管理fragment的生命週期, 大多數地方和管理activity生命週期很像.和activity一樣, fragment可以處於3種狀態:
   Resumed
        在運行中的activity中fragment可見.
   Paused
        另一個activity處於前台並擁有焦點, 但是這個fragment所在的activity仍然可見(前台activity局部透明或者沒有覆蓋整個螢幕).
   Stopped
        要麼是宿主activity已經被停止, 要麼是fragment從activity被移除但被添加到後台堆棧中.
        停止狀態的fragment仍然活著(所有狀態和成員資訊被系統保持著). 然而, 它對使用者不再可見, 並且如果activity被幹掉,他也會被幹掉.

其對應關係圖如下:

           和activity一樣, 你可以使用Bundle保持fragment的狀態, 萬一activity的進程被幹掉,並且當activity被重新建立的時候, 你需要恢複fragment的狀態時就可以用到. 你可以在fragment的 onSaveInstanceState() 期間儲存狀態, 並可以在 onCreate(), onCreateView() 或 onActivityCreated()
期間恢複它.
      生命週期方面activity和fragment之間最重要的區別是各自如何在它的後台堆棧中儲存. 在預設情況下, activity在停止後, 它會被放到一個由系統管理的用於儲存activity的後台堆棧.(因此使用者可以使用BACK按鍵導航回退到它).
      然而, 僅當你在一個事務期間移除fragment時,顯式調用addToBackStack()請求儲存執行個體時,才被放到一個由宿主activity管理的後台堆棧.
    另外, 管理fragment的生命週期和管理activity生命週期非常類似.因此, "managing the activitylifecycle"中的相同實踐也同樣適用於fragment. 你需要理解的是,  activity的生命如何影響fragment的生命.

與activity生命週期的協調工作

       fragment所生存的activity的生命週期,直接影響fragment的生命週期,每一個activity的生命週期的回調行為都會引起每一個fragment中類似的回調.
       例如,當activity接收到onPause()時,activity中的每一個fragment都會接收到onPause().
       Fragment 有一些額外的生命週期回調方法, 那些是處理與activity的唯一的互動,為了執行例如建立和銷毀fragment的UI的動作. 這些額外的回調方法是:

  • onAttach()
    當fragment被綁定到activity時被調用(Activity會被傳入.).
  • onCreateView()
    建立和fragment關聯的view hierarchy時調用.
  • onActivityCreated()
    當activity的onCreate()方法返回時被調用.
  • onDestroyView()
    當和fragment關聯的view hierarchy正在被移除時調用.
  • onDetach()
    當fragment從activity解除關聯時被調用.

       fragment生命週期的流程, 以及宿主activity對它的影響,在圖3中顯示.在這個圖中,可以看到activity依次的每個狀態是如何決定fragment可能接收到的回調方法.例如, 當activity接收到它的onCreate(),activity中的fragment接收到最多是onActivityCreated().
       一旦activity到達了resumed狀態, 你可以自由地在activity添加和移除fragment.因此,僅當activity處於resumed狀態時, fragment的生命週期才可以獨立變化.
       無論如何, 當activity離開resumed狀態,fragment再次被activity的推入它自己的生命週期過程

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.