鍍金池/ 教程/ Android/ Android碎片/片段
Android 應(yīng)用組件
使用布局文件自定義Android組件
Android通知
Android主題示例
Android JetPlayer實(shí)例
Android MediaPlayer(多媒體播放)
Android AbsoluteLayout
Android FrameLayout
Android Gestures/手勢(shì)
Android AutoCompleteTextView(自動(dòng)完成)實(shí)例
Android 資源組織和訪(fǎng)問(wèn)
Android ListView
Android GridView
Android數(shù)據(jù)備份
Android撥打電話(huà)
Android發(fā)送短信/SMS
Android ProgressDialog
SimpleCursorAdapter
Android發(fā)送電子郵件
Android Activity
Android TextView
Android事件處理
Android TableLayout
Android加載Spinner
Android內(nèi)容提供者
Android自定義字體
Android Service
Android CheckBox
Android Intent過(guò)濾器
Android LinearLayout
Android登錄實(shí)例
Android RadioButton
Android樣式和主題
Android自定義組件及屬性
Android UI控件
Android Animation(動(dòng)畫(huà))實(shí)例
Android Camera(攝像頭)
Android ToggleButton
Android Clipboard(復(fù)制/剪貼板)
Android音頻捕獲(錄音)
發(fā)布Android應(yīng)用
Android Alertdialog(警告對(duì)話(huà)框)
Android圖片效果
Android內(nèi)部存儲(chǔ)
Android基于位置服務(wù)
Android RadioGroup
Android AutoCompleteTextView
Android Bluetooth(藍(lán)牙)實(shí)例
Android RelativeLayout
Android最佳實(shí)踐
Android本地化
Android自定義組件
Android教程
Android 架構(gòu)
Android UI布局
Android Button
Android Hello World示例
Android音頻管理器實(shí)例
ArrayAdapter
Android拖放
Android碎片/片段
Android圖片切換
Android JSON解析器
Android開(kāi)發(fā)環(huán)境搭建
Android Spinner
Android樣式示例
使用活動(dòng)代碼自定義Android組件
Android ImageButton
Android EditText
Android廣播接收器

Android碎片/片段

片段(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ì)分離。

Android Fragment

應(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):

  • onAttach()

  • onCreate()

  • onCreateView()

  • onActivityCreated()


階段 II: 當(dāng)片段變得可見(jiàn),它通過(guò)這些狀態(tài):

  • onStart()

  • onResume()

階段 III: 當(dāng)碎片進(jìn)入后臺(tái)模式,它通過(guò)這些狀態(tài):

  • onPaused()

  • onStop()

階段 IV: 當(dāng)片段被破壞,它通過(guò)以下?tīng)顟B(tài):

  • onPaused()

  • onStop()

  • onDestroyView()

  • onDestroy()

  • onDetach()

Activity Fragment Lifecyle

如何使用碎片?

這里演示簡(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.