片段(Fragments)是一個(gè)應(yīng)用程序的用戶(hù)界面或行為活動(dòng),使活動(dòng)更加模塊化設(shè)計(jì),可以放置在一塊。一個(gè)片段是一種子活動(dòng)。以下要點(diǎn)有關(guān)片段:
片段都有自己的布局和規(guī)范自己的行為與生命周期回調(diào)。
可以添加或刪除片段在活動(dòng)而活動(dòng)運(yùn)行。
可以將多個(gè)片段在一個(gè)單一的活動(dòng),建立一個(gè)多窗格UI。
片段可用于多種活動(dòng)。
片段的生命周期是密切相關(guān),其主機(jī)活動(dòng)的生命周期,表示當(dāng)活動(dòng)暫停時(shí),所有的片段也將停止活動(dòng)。
片段可以實(shí)現(xiàn)的行為當(dāng)沒(méi)有用戶(hù)界面組件。
片段加入被加入到 Android API 在Honeycomb版本的Android(API版本11)。
創(chuàng)建片段可以擴(kuò)展Fragment 類(lèi)并在活動(dòng)的布局文件中聲明片段,可以插入到活動(dòng)布局的一個(gè)片段到<fragment>元素。
介紹片段之前,有一個(gè)限制,因?yàn)榭梢栽谝粋€(gè)特定的時(shí)間點(diǎn),屏幕上只顯示單個(gè)活動(dòng)。所以不能夠分割設(shè)備屏幕來(lái)分別控制不同部位。但隨著引進(jìn)片段得到了更多的靈活性,并在屏幕上同一時(shí)時(shí)間可以將一個(gè)單一的活動(dòng)取消限制。現(xiàn)在有一個(gè)單一的acitivity ,但每個(gè)acitivity 可以包括多個(gè)片段,它們有自己的布局,活動(dòng)和完整的生命周期。
下面是一個(gè)典型的例子,兩個(gè)UI模塊定義的片段可以組合成平板電腦的設(shè)計(jì)的一個(gè)活動(dòng),這里在手機(jī)中設(shè)計(jì)分離。
應(yīng)用程序嵌入活動(dòng)A中兩個(gè)片段,在一個(gè)平板大小的設(shè)備上運(yùn)行。然而在手機(jī)大小的屏幕上,有兩個(gè)片段有足夠的空間,所以Activity A包括片段物品的清單,當(dāng)用戶(hù)選擇一篇文章時(shí),它開(kāi)始使用Activity B,包括閱讀第二片段的文章。
Android 的碎片有自己的生命周期,非常相似 Android 中的 Activity 。本節(jié)主要闡述其生命周期在不同階段。
階段 I: 當(dāng)被創(chuàng)建了一個(gè)片段,它通過(guò)以下?tīng)顟B(tài):
階段 II: 當(dāng)片段變得可見(jiàn),它通過(guò)這些狀態(tài):
階段 III: 當(dāng)碎片進(jìn)入后臺(tái)模式,它通過(guò)這些狀態(tài):
階段 IV: 當(dāng)片段被破壞,它通過(guò)以下?tīng)顟B(tài):
|
這里演示簡(jiǎn)單的步驟來(lái)創(chuàng)建碎片:
首先,要決定有多少碎片要在活動(dòng)中要使用。例如,要使用兩個(gè)片段處理設(shè)備的橫向和縱向模式。
在下一頁(yè)的碎片數(shù)量的基礎(chǔ)上,創(chuàng)建類(lèi)將擴(kuò)展 Fragment 類(lèi)。上述片段類(lèi)的回調(diào)函數(shù)??梢愿鶕?jù)要求覆蓋所有的功能。
對(duì)應(yīng)每一個(gè)片段,需要在XML文件中創(chuàng)建布局。這些文件將根據(jù)布局來(lái)定義碎片。
最后修改活動(dòng)文件替換片段,根據(jù)需要來(lái)定義實(shí)際的邏輯。
這里是重要的 覆蓋在Fragment 類(lèi)的方法,如下列表:
onCreate() 系統(tǒng)調(diào)用時(shí)創(chuàng)建片段。初始化片段要保留暫停或停止時(shí)的片段,然后恢復(fù)其它組成部分。
onCreateView() 當(dāng)片段第一次繪制用戶(hù)界面時(shí),系統(tǒng)調(diào)用這個(gè)回調(diào)。要繪制一個(gè)UI為片段,必須返回一個(gè) View 組件,此方法是片段的根布局。返回空片段不提供一個(gè)UI。
onPause() 系統(tǒng)調(diào)用此方法,作為第一次指示用戶(hù)離開(kāi)此片段。這通常是提交更改操作,持久化時(shí)間超過(guò)當(dāng)前用戶(hù)會(huì)話(huà)時(shí)間。
下面的這個(gè)例子將解釋如何創(chuàng)建片段 - Fragments。在這里將創(chuàng)建兩個(gè)片段并且當(dāng)其中一個(gè)使用的設(shè)備是在橫向模式下,另一個(gè)片段將被用在縱向模式下。按照下面的步驟類(lèi)似于在前面創(chuàng)建的Hello World范例:
步驟 | 描述 |
---|---|
1 | 使用Eclipse IDE創(chuàng)建Android應(yīng)用程序,并將其命名為MyFragments在一個(gè)包c(diǎn)om.example.myfragments下 ,使用空活動(dòng)。 |
2 | 主要活動(dòng)文件MainActivity.java的代碼修改為如下。在這里將檢查設(shè)備的方向并在不同的片段之間進(jìn)行切換。 |
3 | 在 com.example.myfragments包下創(chuàng)建兩個(gè)java文件PM_Fragment.java和LM_Fragement.java來(lái)定義片段以及相關(guān)方法。 |
4 | 創(chuàng)建布局文件 res/layout/lm_fragment.xml 并布局定義這兩個(gè)片段。 |
5 | 修改 res/layout/activity_main.xml 文件的默認(rèn)內(nèi)容,以包括兩個(gè)片段。 |
6 | 在 res/values/strings.xml文件中定義所需的常量 |
7 | 運(yùn)行該應(yīng)用程序啟動(dòng) Android 模擬器來(lái)驗(yàn)證應(yīng)用程序所做的修改結(jié)果。 |
以下是主要活動(dòng)文件的內(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)建兩個(gè)的片段文件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.