片段(Fragments)是一個應(yīng)用程序的用戶界面或行為活動,使活動更加模塊化設(shè)計,可以放置在一塊。一個片段是一種子活動。以下要點有關(guān)片段:
片段都有自己的布局和規(guī)范自己的行為與生命周期回調(diào)。
可以添加或刪除片段在活動而活動運行。
可以將多個片段在一個單一的活動,建立一個多窗格UI。
片段可用于多種活動。
片段的生命周期是密切相關(guān),其主機活動的生命周期,表示當(dāng)活動暫停時,所有的片段也將停止活動。
片段可以實現(xiàn)的行為當(dāng)沒有用戶界面組件。
片段加入被加入到 Android API 在Honeycomb版本的Android(API版本11)。
創(chuàng)建片段可以擴展Fragment 類并在活動的布局文件中聲明片段,可以插入到活動布局的一個片段到<fragment>元素。
介紹片段之前,有一個限制,因為可以在一個特定的時間點,屏幕上只顯示單個活動。所以不能夠分割設(shè)備屏幕來分別控制不同部位。但隨著引進片段得到了更多的靈活性,并在屏幕上同一時時間可以將一個單一的活動取消限制?,F(xiàn)在有一個單一的acitivity ,但每個acitivity 可以包括多個片段,它們有自己的布局,活動和完整的生命周期。
下面是一個典型的例子,兩個UI模塊定義的片段可以組合成平板電腦的設(shè)計的一個活動,這里在手機中設(shè)計分離。
應(yīng)用程序嵌入活動A中兩個片段,在一個平板大小的設(shè)備上運行。然而在手機大小的屏幕上,有兩個片段有足夠的空間,所以Activity A包括片段物品的清單,當(dāng)用戶選擇一篇文章時,它開始使用Activity B,包括閱讀第二片段的文章。
Android 的碎片有自己的生命周期,非常相似 Android 中的 Activity 。本節(jié)主要闡述其生命周期在不同階段。
|
階段 I: 當(dāng)被創(chuàng)建了一個片段,它通過以下狀態(tài):
階段 II: 當(dāng)片段變得可見,它通過這些狀態(tài):
階段 III: 當(dāng)碎片進入后臺模式,它通過這些狀態(tài):
階段 IV: 當(dāng)片段被破壞,它通過以下狀態(tài):
|
![]() |
這里演示簡單的步驟來創(chuàng)建碎片:
首先,要決定有多少碎片要在活動中要使用。例如,要使用兩個片段處理設(shè)備的橫向和縱向模式。
在下一頁的碎片數(shù)量的基礎(chǔ)上,創(chuàng)建類將擴展 Fragment 類。上述片段類的回調(diào)函數(shù)??梢愿鶕?jù)要求覆蓋所有的功能。
對應(yīng)每一個片段,需要在XML文件中創(chuàng)建布局。這些文件將根據(jù)布局來定義碎片。
最后修改活動文件替換片段,根據(jù)需要來定義實際的邏輯。
這里是重要的 覆蓋在Fragment 類的方法,如下列表:
onCreate() 系統(tǒng)調(diào)用時創(chuàng)建片段。初始化片段要保留暫?;蛲V箷r的片段,然后恢復(fù)其它組成部分。
onCreateView() 當(dāng)片段第一次繪制用戶界面時,系統(tǒng)調(diào)用這個回調(diào)。要繪制一個UI為片段,必須返回一個 View 組件,此方法是片段的根布局。返回空片段不提供一個UI。
onPause() 系統(tǒng)調(diào)用此方法,作為第一次指示用戶離開此片段。這通常是提交更改操作,持久化時間超過當(dāng)前用戶會話時間。
下面的這個例子將解釋如何創(chuàng)建片段 - Fragments。在這里將創(chuàng)建兩個片段并且當(dāng)其中一個使用的設(shè)備是在橫向模式下,另一個片段將被用在縱向模式下。按照下面的步驟類似于在前面創(chuàng)建的Hello World范例:
| 步驟 | 描述 |
|---|---|
| 1 | 使用Eclipse IDE創(chuàng)建Android應(yīng)用程序,并將其命名為MyFragments在一個包com.example.myfragments下 ,使用空活動。 |
| 2 | 主要活動文件MainActivity.java的代碼修改為如下。在這里將檢查設(shè)備的方向并在不同的片段之間進行切換。 |
| 3 | 在 com.example.myfragments包下創(chuàng)建兩個java文件PM_Fragment.java和LM_Fragement.java來定義片段以及相關(guān)方法。 |
| 4 | 創(chuàng)建布局文件 res/layout/lm_fragment.xml 并布局定義這兩個片段。 |
| 5 | 修改 res/layout/activity_main.xml 文件的默認(rèn)內(nèi)容,以包括兩個片段。 |
| 6 | 在 res/values/strings.xml文件中定義所需的常量 |
| 7 | 運行該應(yīng)用程序啟動 Android 模擬器來驗證應(yīng)用程序所做的修改結(jié)果。 |
以下是主要活動文件的內(nèi)容 src/com.example.mycontentprovider/MainActivity.java 修改
package com.example.myfragments; import android.os.Bundle; import android.app.Activity; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.res.Configuration; import android.view.WindowManager; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Configuration config = getResources().getConfiguration(); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); /** * Check the device orientation and act accordingly */ if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) { /** * Landscape mode of the device */ LM_Fragment ls_fragment = new LM_Fragment(); fragmentTransaction.replace(android.R.id.content, ls_fragment); }else{ /** * Portrait mode of the device */ PM_Fragment pm_fragment = new PM_Fragment(); fragmentTransaction.replace(android.R.id.content, pm_fragment); } fragmentTransaction.commit(); } }
創(chuàng)建兩個的片段文件LM_Fragement.java 和 PM_Fragment.java在com.example.mycontentprovider 包下。
以下是LM_Fragement.java文件的內(nèi)容 :
package com.example.myfragments; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class LM_Fragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { /** * Inflate the layout for this fragment */ return inflater.inflate( R.layout.lm_fragment, container, false); } }
下面是 PM_Fragement.java 文件的內(nèi)容:
package com.example.myfragments; import android.app.Fragment; import android.os.Bundle; import android.view.