黃立明+江有福+陸雅男
摘要:以傳統(tǒng)的方式實現(xiàn)多級選項列表,不僅構建困難,而且不利于管理,缺乏靈活性,這種情況在Android 3.0引入了Fragment技術之后得到改善。Fragment技術支持更加靈活的UI設計,增強了對平板和手機的兼容性,為多級選項列表的實現(xiàn)提供了一種全新的設計思路。本文完整地介紹Fragment的生命周期,并通過詳細的實例制作過程體現(xiàn)其靈活和便于管理的特性。
關鍵詞:安卓;碎片;用戶界面;多級選項列表
中圖分類號:G642 文獻標志碼:A 文章編號:1674-9324(2015)15-0153-04
0 引言
Fragment中文意思是碎片,用于在一個Activity中描述部分操作界面和相關的行為。使用Fragment分散整個Activity的布局,體現(xiàn)出了良好的模塊化思維,提高了碎片的重用性。Fragment技術出現(xiàn)之前,多級選項列表的實現(xiàn)方式是先設置布局,再控制各級列表對應視圖的展現(xiàn)或隱藏。這樣做,更多關注的是視圖層次的變化,但是根據線程安全的原則,在子線程中不能直接修改UI界面,難以實現(xiàn)靈活管理。雖然可以使用Handler消息機制解決靈活管理的問題,但是Handler機制比較煩瑣,容易導致代碼臃腫。然而使用Fragment,則不需要親自管理視圖層次的復雜變化,會在程序運行時修改Activity的外觀。所以我們依據Fragment靈活的特性來實現(xiàn)多級選項列表,同時保持了良好的代碼風格。
圖1是Fragment和Activity生命周期的對比圖。Fragment作為Activity的一部分,擁有一個與其相關的視圖層次結構以及與Activity非常相似的生命周期。
1 Fragment初始化
Fragment并非Activity的子類,F(xiàn)ragment直接繼承Object,而Activity直接繼承ContextThemeWrapper。
2 Fragment的生命周期
2.1 onAttach()
當Fragment附加到Activity時,該回調方法會被調用。此方法中可以通過getActivity()方法獲得附加的Activity,將Fragment附加到Activity前,可以使用setArguments()方法附加參數到一個Bundle對象(初始化參數包)。在Fragment的整個生命周期中,初始化參數包都可以用Fragment的getArguments()方法獲得。
2.2 onCreate()
此回調發(fā)生在Activity需要獲取Fragment的布局時。如果Fragment是恢復的,則該回調過程中可以獲取傳入的Bundle型對象包savedInstanceState,這個對象包保存了Fragment的上一狀態(tài)數據,也可以在onCreateView()和onActivityCreated()中獲取該對象包。這個過程中應當盡量避免可能阻塞主線程的操作,例如獲取網絡數據,登陸驗證等。
2.3 onCreateView()
此回調發(fā)生在Fragment繪制界面并返回一個根視圖時,如果不需要視圖層次,可以返回null。該方法的聲明中包含三個參數,分別是inflater,container,savedInstanceState。inflater參數可以調用inflate()方法動態(tài)加載一個xml布局文件來返回視圖;container參數指定需要插入fragment布局的父容器;savedInstanceState參數不再贅述。
2.4 onActivityCreated()
此回調過程發(fā)生在Activity的onCreate()回調之后,可以存在需要依賴于Activity視圖層次的代碼,例如進行一些屬性的設置。
2.5 其他
只有當Activity處于resumed狀態(tài)時,F(xiàn)ragment的生命周期才得以獨立運轉,其他它時候是依賴于Activity的生命周期變化的。這種綁定Activity的時期包含了onStart()回調、onResume()回調、onPause()回調以及onStop()回調。因為我們不確定用戶是否還會返回,在onPause()方法中通常做一些數據持久化的工作,再通過onSaveInstanceState()方法保存Fragment的狀態(tài)值。
3 創(chuàng)建Fragment
創(chuàng)建Fragment首先需要創(chuàng)建擴展Fragment類的Java類,并重寫其onCreateView()方法,在這個方法中按具體的方式創(chuàng)建碎片。
3.1 加載布局式
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
View v = inflater.inflate(R.layout.content,null);
}
該方式通過LayoutInflater類的對象inflater調用inflate()方法加載xml布局文件來創(chuàng)建Fragment。示例代碼中加載的是content.xml布局文件。
3.2 Java代碼式
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
//構建Fragment的java代碼
}
該方式通過在onCreateView()方法中書寫java代碼來構建Fragment。
4 顯示Fragment
在Activity中顯示Fragment主要有兩種方式,分別是靜態(tài)載入xml布局方式和動態(tài)管理方式。第一種方式是對碎片進行布局,盡管這種方式已經夠用,但是為了更好的實現(xiàn)運行時刻與屏幕上的碎片交互,還需引入動態(tài)管理的方式。
4.1 靜態(tài)載入xml
該方式是通過在Activity的xml布局文件中定義一個或多個
4.2 動態(tài)管理
該方式需要借助Android系統(tǒng)控制碎片的工具FragmentManager來實現(xiàn)的。需要注意的是,xml布局中使用
實現(xiàn)步驟如下:
(1)先調用指定類的初始化函數實例化Fragment。
(2)再使用getFragmentManager()方法獲取FragmentManager,并通過其提供的接口方法beginTransaction()返回一個FragmentTransaction的實例。
(3)然后設置Fragment的轉場動畫。
(4)再指定方式(replace、remove、add)和需要替換為碎片的視圖容器(第一個參數)。
(5)最后提交事務。
對應代碼如下圖所示。
5 制作多級選項列表
使用安卓開發(fā)工具ADT設計應用程序時,首先需要編寫應用程序主界面Activity的xml布局文件,然后其余的工作交由java過程設計代碼來處理。通常編程人員在繼承使用系統(tǒng)類的時候,會依照實際開發(fā)需求擴展需要的功能。此處我們需要擴展使用ListFragment,實現(xiàn)其中的onListItemClick()方法來響應用戶的點擊事件。
5.1 Activity的xml布局
5.2 一級列表
主要代碼如圖3所示。
代碼分析:
一級列表類TitleFragment用于顯示一級列表,是以靜態(tài)形式首先被加載,所以不需要初始化,即不需要顯式的構造函數。在Activity調用setContentView()方法設置視圖時,F(xiàn)ragment通過xml文件中〈fragment〉標記映射對應的類。
第3~10行:在onCreate()方法中準備列表的數據;
第11~13行:在onCreate()方法中指定適配器;
第17行:在OnActivityCreated()方法中為列表設置適配器;
第22行:重寫ListFragment的onListItemClick()方法,其中調用showDetails()方法;
第27~31行:在showDetails()方法中使用動態(tài)管理的方式顯示二級列表視圖。
實現(xiàn)效果如圖4所示。
5.3 二級列表
5.3.1 主要代碼如圖5所示。
代碼分析:
二級列表類DetailFragment1用于顯示二級列表,因為二級列表需要根據一級列表的選中值來動態(tài)選擇該列表所要顯示的內容,所以需要顯式的寫出初始化函數。
第1~2行:顯式的初始化函數newInstance()中實例化DetailFragment1_triage;
第3~6行:使用bundle包保存二級列表的狀態(tài),并返回DetailFragment1_triage類的對象df;
第11~13行:在onCreateView()方法中,為listview設置適配器;
第14行:給listview設定選擇模式;
第16行:返回視圖listview;
第23行:重寫onListItemClick()方法中調用showDetails()方法;
第26~27行:在showDetails()方法中使用動態(tài)管理的方式顯示三級列表。
實現(xiàn)效果如圖6所示。
5.4 三級列表
三級列表類DetailFragment2的實現(xiàn)和二級列表類DetailFragment1的實現(xiàn)類似。
6 最終效果
7 總結
本文基于對Fragment生命周期的理解,挖掘了Fragment技術的使用范圍,提供了一種新的基于Fragment技術實現(xiàn)多級選項列表的方法。
基于Fragment技術的應用程序設計體現(xiàn)了如下的幾大特性。
(1)對Android手機和平板有良好的兼容性。
(2)Fragment對應用程序框架構建的支持,淘汰了陳舊的TabActivity和ActivityGroup。
(3)Fragment分散Activity的特性大大提升Fragment代碼的重用性。
參考文獻:
[1]王云林.Android應用中跨版本集成新特性的研究與實現(xiàn)[D].上海:東華大學計算機系,2013.
[2]史書明.Android應用中消息傳遞方法分析[J].電腦知識與技術,2014,10(13):2984-2986.
[3]李剛.瘋狂Android講義[M].北京:電子工業(yè)出版社,2013.
[4]王濤.安卓系統(tǒng)消息傳遞方法研究[J].安陽工學院學報,2014,13(4):61-63.
[5]Chris Haseman.Android應用開發(fā)[M].北京:人民郵電出版社,2013:172-178.