?

用Android Fragment技術實現多級選項列表

2015-12-09 20:47黃立明江有福陸雅男
教育教學論壇 2015年15期
關鍵詞:用戶界面安卓

黃立明+江有福+陸雅男

摘要:以傳統的方式實現多級選項列表,不僅構建困難,而且不利于管理,缺乏靈活性,這種情況在Android 3.0引入了Fragment技術之后得到改善。Fragment技術支持更加靈活的UI設計,增強了對平板和手機的兼容性,為多級選項列表的實現提供了一種全新的設計思路。本文完整地介紹Fragment的生命周期,并通過詳細的實例制作過程體現其靈活和便于管理的特性。

關鍵詞:安卓;碎片;用戶界面;多級選項列表

中圖分類號:G642 文獻標志碼:A 文章編號:1674-9324(2015)15-0153-04

0 引言

Fragment中文意思是碎片,用于在一個Activity中描述部分操作界面和相關的行為。使用Fragment分散整個Activity的布局,體現出了良好的模塊化思維,提高了碎片的重用性。Fragment技術出現之前,多級選項列表的實現方式是先設置布局,再控制各級列表對應視圖的展現或隱藏。這樣做,更多關注的是視圖層次的變化,但是根據線程安全的原則,在子線程中不能直接修改UI界面,難以實現靈活管理。雖然可以使用Handler消息機制解決靈活管理的問題,但是Handler機制比較煩瑣,容易導致代碼臃腫。然而使用Fragment,則不需要親自管理視圖層次的復雜變化,會在程序運行時修改Activity的外觀。所以我們依據Fragment靈活的特性來實現多級選項列表,同時保持了良好的代碼風格。

圖1是Fragment和Activity生命周期的對比圖。Fragment作為Activity的一部分,擁有一個與其相關的視圖層次結構以及與Activity非常相似的生命周期。

1 Fragment初始化

Fragment并非Activity的子類,Fragment直接繼承Object,而Activity直接繼承ContextThemeWrapper。

2 Fragment的生命周期

2.1 onAttach()

當Fragment附加到Activity時,該回調方法會被調用。此方法中可以通過getActivity()方法獲得附加的Activity,將Fragment附加到Activity前,可以使用setArguments()方法附加參數到一個Bundle對象(初始化參數包)。在Fragment的整個生命周期中,初始化參數包都可以用Fragment的getArguments()方法獲得。

2.2 onCreate()

此回調發生在Activity需要獲取Fragment的布局時。如果Fragment是恢復的,則該回調過程中可以獲取傳入的Bundle型對象包savedInstanceState,這個對象包保存了Fragment的上一狀態數據,也可以在onCreateView()和onActivityCreated()中獲取該對象包。這個過程中應當盡量避免可能阻塞主線程的操作,例如獲取網絡數據,登陸驗證等。

2.3 onCreateView()

此回調發生在Fragment繪制界面并返回一個根視圖時,如果不需要視圖層次,可以返回null。該方法的聲明中包含三個參數,分別是inflater,container,savedInstanceState。inflater參數可以調用inflate()方法動態加載一個xml布局文件來返回視圖;container參數指定需要插入fragment布局的父容器;savedInstanceState參數不再贅述。

2.4 onActivityCreated()

此回調過程發生在Activity的onCreate()回調之后,可以存在需要依賴于Activity視圖層次的代碼,例如進行一些屬性的設置。

2.5 其他

只有當Activity處于resumed狀態時,Fragment的生命周期才得以獨立運轉,其他它時候是依賴于Activity的生命周期變化的。這種綁定Activity的時期包含了onStart()回調、onResume()回調、onPause()回調以及onStop()回調。因為我們不確定用戶是否還會返回,在onPause()方法中通常做一些數據持久化的工作,再通過onSaveInstanceState()方法保存Fragment的狀態值。

3 創建Fragment

創建Fragment首先需要創建擴展Fragment類的Java類,并重寫其onCreateView()方法,在這個方法中按具體的方式創建碎片。

3.1 加載布局式

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){

View v = inflater.inflate(R.layout.content,null);

}

該方式通過LayoutInflater類的對象inflater調用inflate()方法加載xml布局文件來創建Fragment。示例代碼中加載的是content.xml布局文件。

3.2 Java代碼式

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){

//構建Fragment的java代碼

}

該方式通過在onCreateView()方法中書寫java代碼來構建Fragment。

4 顯示Fragment

在Activity中顯示Fragment主要有兩種方式,分別是靜態載入xml布局方式和動態管理方式。第一種方式是對碎片進行布局,盡管這種方式已經夠用,但是為了更好的實現運行時刻與屏幕上的碎片交互,還需引入動態管理的方式。

4.1 靜態載入xml

該方式是通過在Activity的xml布局文件中定義一個或多個標記,標記中映射了處理該Fragment的類,然后將布局設置為一個Activity類的內容視圖來實現。

4.2 動態管理

該方式需要借助Android系統控制碎片的工具FragmentManager來實現的。需要注意的是,xml布局中使用標記靜態聲明的視圖容器是不能被替換的。

實現步驟如下:

(1)先調用指定類的初始化函數實例化Fragment。

(2)再使用getFragmentManager()方法獲取FragmentManager,并通過其提供的接口方法beginTransaction()返回一個FragmentTransaction的實例。

(3)然后設置Fragment的轉場動畫。

(4)再指定方式(replace、remove、add)和需要替換為碎片的視圖容器(第一個參數)。

(5)最后提交事務。

對應代碼如下圖所示。

5 制作多級選項列表

使用安卓開發工具ADT設計應用程序時,首先需要編寫應用程序主界面Activity的xml布局文件,然后其余的工作交由java過程設計代碼來處理。通常編程人員在繼承使用系統類的時候,會依照實際開發需求擴展需要的功能。此處我們需要擴展使用ListFragment,實現其中的onListItemClick()方法來響應用戶的點擊事件。

5.1 Activity的xml布局

5.2 一級列表

主要代碼如圖3所示。

代碼分析:

一級列表類TitleFragment用于顯示一級列表,是以靜態形式首先被加載,所以不需要初始化,即不需要顯式的構造函數。在Activity調用setContentView()方法設置視圖時,Fragment通過xml文件中〈fragment〉標記映射對應的類。

第3~10行:在onCreate()方法中準備列表的數據;

第11~13行:在onCreate()方法中指定適配器;

第17行:在OnActivityCreated()方法中為列表設置適配器;

第22行:重寫ListFragment的onListItemClick()方法,其中調用showDetails()方法;

第27~31行:在showDetails()方法中使用動態管理的方式顯示二級列表視圖。

實現效果如圖4所示。

5.3 二級列表

5.3.1 主要代碼如圖5所示。

代碼分析:

二級列表類DetailFragment1用于顯示二級列表,因為二級列表需要根據一級列表的選中值來動態選擇該列表所要顯示的內容,所以需要顯式的寫出初始化函數。

第1~2行:顯式的初始化函數newInstance()中實例化DetailFragment1_triage;

第3~6行:使用bundle包保存二級列表的狀態,并返回DetailFragment1_triage類的對象df;

第11~13行:在onCreateView()方法中,為listview設置適配器;

第14行:給listview設定選擇模式;

第16行:返回視圖listview;

第23行:重寫onListItemClick()方法中調用showDetails()方法;

第26~27行:在showDetails()方法中使用動態管理的方式顯示三級列表。

實現效果如圖6所示。

5.4 三級列表

三級列表類DetailFragment2的實現和二級列表類DetailFragment1的實現類似。

6 最終效果

7 總結

本文基于對Fragment生命周期的理解,挖掘了Fragment技術的使用范圍,提供了一種新的基于Fragment技術實現多級選項列表的方法。

基于Fragment技術的應用程序設計體現了如下的幾大特性。

(1)對Android手機和平板有良好的兼容性。

(2)Fragment對應用程序框架構建的支持,淘汰了陳舊的TabActivity和ActivityGroup。

(3)Fragment分散Activity的特性大大提升Fragment代碼的重用性。

參考文獻:

[1]王云林.Android應用中跨版本集成新特性的研究與實現[D].上海:東華大學計算機系,2013.

[2]史書明.Android應用中消息傳遞方法分析[J].電腦知識與技術,2014,10(13):2984-2986.

[3]李剛.瘋狂Android講義[M].北京:電子工業出版社,2013.

[4]王濤.安卓系統消息傳遞方法研究[J].安陽工學院學報,2014,13(4):61-63.

[5]Chris Haseman.Android應用開發[M].北京:人民郵電出版社,2013:172-178.

猜你喜歡
用戶界面安卓
自然用戶界面在智能家居系統中的應用路徑創新研究:生成式人工智能技術的調節作用
基于CiteSpace的國外用戶界面體驗圖譜量化分析
MIPS安卓平臺上ARM二進制翻譯系統
文物表情包
物聯網用戶界面如何工作
安卓系統或成智能汽車標配
一種基于安卓系統的手機側抓包分析方法
基于B/S的跨平臺用戶界面可配置算法研究
安卓L未至安卓M來了!安卓首泄漏M系統
精彩絕倫的Android UI設計:響應式用戶界面與設計模式
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合