BlackBerry應(yīng)用開發(fā)者指南 創(chuàng)建客戶定制的UI組件
本文為《BlackBerry應(yīng)用開發(fā)者指南 UI API篇之創(chuàng)建客戶定制的UI組件》,本文依舊是介紹BlackBerry UI API篇,如何創(chuàng)建創(chuàng)建客戶定制的UI組件。
創(chuàng)建客戶定制的UI組件
你僅能將定制的上下文菜單項(xiàng)和布局增加到一個(gè)定制的 field 中。
創(chuàng)建定制的 field
為覆寫 field 的缺省行為,創(chuàng)建一個(gè)定制的 field。
(注:不要使用 Screen 對(duì)象來輸入文本。Screen 對(duì)象沒有明確的實(shí)現(xiàn)此功能,它需要復(fù)雜的輸入方法,例如國際化的鍵盤和 7100 系列的設(shè)備。為了實(shí)現(xiàn)不同輸入方法的無縫集成,擴(kuò)展 Field 或者其任一子類。)
DrawStyle 接口的實(shí)現(xiàn)允許在定制的 field 上繪制樣式。
客戶定制的 field 應(yīng)該實(shí)現(xiàn)所有相關(guān)的系統(tǒng)樣式。例如,USE_ALL_WIDTH 和 USE_ALL_HEIGHT適用于許多 field。
擴(kuò)展 Field 類
擴(kuò)展 Field 類和任一其子類,指定定制 Field 的特征。

定義按鈕的標(biāo)簽,圖形,以及樣式
你的構(gòu)造子的實(shí)現(xiàn)定義了按鈕的標(biāo)簽,圖形,以及樣式。

指定 field 中對(duì)象的安排
任何擴(kuò)展 Field 的類必須實(shí)現(xiàn) layout().Field 管理器調(diào)用了 layout()方法來決定 field應(yīng)該如何根據(jù)可用的控件安排它的內(nèi)容。

定義需要的寬度
(注:在大多數(shù)情況下,通過覆寫 getPreferredWidth(),確保合適的布局出現(xiàn)在定制的布局管理器里。)
getPreferredWidth()的實(shí)現(xiàn)計(jì)算出定制 Field 的寬度,這個(gè)定制 Field 是基于標(biāo)簽 Field的相對(duì)尺寸的。使用相對(duì)尺寸來確保標(biāo)簽不會(huì)超出標(biāo)簽的尺寸。


定義需要的高度
(注:在大多數(shù)情況下,通過覆寫 getPreferredHeight(),確保合適的布局出現(xiàn)在定制的布局管理器里。)
getPreferredHeight()的實(shí)現(xiàn)計(jì)算出定制 Field 的高度,這個(gè)定制 Field 是基于標(biāo)簽 Field的相對(duì)尺寸的。它確保了標(biāo)簽不會(huì)超出 field 的尺寸。

定義定制 field 的外觀
paint()的實(shí)現(xiàn)定義了 BlackBerry 設(shè)備屏幕上的定制 Field 的外觀,不管什么時(shí)候 Field的域標(biāo)記為無效,F(xiàn)ield 管理器都調(diào)用 paint()來重繪 Field。
技巧:驗(yàn)證 paint()是否是有效率的,因?yàn)椴还苁裁磿r(shí)候 field 發(fā)生變化,UI 框架調(diào)用 paint()方法。對(duì)于大數(shù)量的 field,使用 Graphics.getClippingRect()并在可見的區(qū)域里繪圖來保存繪制時(shí)間。


處理焦點(diǎn)事件
為了支持焦點(diǎn)事件,使用 Field.FOCUSABLE 樣式以及實(shí)現(xiàn) Field.moveFocus().如果你想你的 Field 接收焦點(diǎn),覆寫 Field.isFocusable()返回 true。
當(dāng) Field 獲得焦點(diǎn)時(shí),UI 框架調(diào)用 onFocus(),當(dāng) Field 失去焦點(diǎn)時(shí),調(diào)用 unFocus().如果你的 field 對(duì)于這些事件需要特定的行為,覆寫這些方法??蚣苷{(diào)用 moveFocus()來處理 field 的焦點(diǎn)移動(dòng)事件。它對(duì)應(yīng) trackwheelRoll 事件,覆寫 drawFocus( )。
實(shí)現(xiàn) set和 get方法
Field 的 get 和 set 方法的實(shí)現(xiàn),增加了 Field 的能力。
(注:所有 get 和 set 方法應(yīng)該在 field 加入到一個(gè) Screen 的前后工作。例如,如果現(xiàn)在屏幕上的 field 合適的調(diào)用了 invalidate()或 updateLayout()setLabel(),應(yīng)該使用一個(gè)新值來修改其顯示。)

代碼實(shí)例
CustomButtonField.java 創(chuàng)建了具有多個(gè)圖形的 button field。
 
 
 
 
 
#p#
創(chuàng)建定制的上下文菜單項(xiàng)
在 Field 類里,創(chuàng)建定制的上下文菜單項(xiàng)。

提供一個(gè)上下文菜單
在主應(yīng)用程序類里,覆寫 makeContextMenu()方法提供一個(gè)上下文菜單。

創(chuàng)建應(yīng)用程序菜單
在主應(yīng)用程序類里,覆寫 makeMenu()方法創(chuàng)建應(yīng)用程序菜單,并且無論合十,當(dāng)特定的 field獲取焦點(diǎn)時(shí),更新上下文菜單。

代碼實(shí)例
實(shí)例: ContextMenuSample.java
- /**
 - * ContextMenuSample.java
 - * Copyright (C) 2001-2005 Research In Motion Limited. All rights
 - reserved.
 - */
 


#p#
創(chuàng)建定制的布局管理器
Manager 對(duì)象管理 UI 組件的位置以及決定屏幕上的 field 如何安排。
創(chuàng)建一個(gè)定制的布局管理器
擴(kuò)展 Manager 類或其任一子類

返回一個(gè)優(yōu)先的 Field寬度
覆寫 getPreferredWidth(),以致它能為管理器返回一個(gè)優(yōu)先的 Field 寬度。
getPreferredWidth()的實(shí)現(xiàn)可以返回不同的值,取決于布局管理器的目的。例如,如果管理器擴(kuò)展了 HorizontalFieldManager,getPreferredWidth()返回所有 field 寬度的總和。如果擴(kuò)展了 VerticalFieldManager,getPreferredWidth()返回最寬 field 的寬度。

(注:TextField 和 Manger 使用了指派給他們的整個(gè)寬度。為組織 2 個(gè)或更多的水平上的對(duì)象,分別覆寫它們各自的 getPreferredWidth()方法。為了組織多個(gè)水平上的TextField,覆寫 layout().)
返回一個(gè)優(yōu)先 Field 高度
覆寫 getPreferredHeight(),以致它能為管理器返回一個(gè)優(yōu)先的 Field 高度。

指定子 Field如何安排
subLayout()方法指定了管理器如何在屏幕上組織 field。它得到管理器中 field 的個(gè)數(shù),然后為子 field 設(shè)置合適的位置以及布局。
layout() 調(diào)用了 subLayout() 方法,subLayout() 方法通過調(diào)用每個(gè)管理器包含的 field 的setPositionChild ()以及 LayoutChild(),控制每個(gè)子 field 如何加到屏幕上。


(注:為設(shè)置 field 需要的大小,在 subLayout()方法里調(diào)用 setExtend()。如果你不調(diào)用 setExtend(),則不會(huì)繪制每個(gè) field,并且也不拋出一個(gè)異常。)
處理焦點(diǎn)
當(dāng)用戶滾動(dòng)滑輪時(shí),為了指定 field 該如何得到焦點(diǎn),覆寫 nextFocus()方法。direction 參數(shù)描述了焦點(diǎn)移動(dòng)的方向(一般來說,當(dāng)滑輪向下滾動(dòng),焦點(diǎn)向下并且向右方向。當(dāng)滑輪向上滾動(dòng),焦點(diǎn)向上并且向左)。

為了將焦點(diǎn)轉(zhuǎn)移到下一個(gè) field,而以管理器的順序,這個(gè) field 不是下一個(gè) field,那么覆寫nextFocus().例如,如果你想為你的管理器實(shí)現(xiàn) Page-up 和 Page-down 的功能,那么 nextFocus()就有用了。
當(dāng)可見區(qū)域改變時(shí)重繪 field
缺省的,定制的管理器在不考慮剪輯區(qū)域下調(diào)用 paint()重繪所有 field。如果這導(dǎo)致了不必要的重繪,當(dāng)可見區(qū)域改變時(shí),僅 subpaint()的實(shí)現(xiàn)重繪所有 field。
代碼實(shí)例
例: DiagonalManager.java
- /**
 - * DiagonalManager.java
 - * Copyright (C) 2001-2005 Research In Motion Limited. All rights
 - reserved.
 - */
 - package
 - com.rim.samples.docs.custommenu;
 - import
 - net.rim.device.api.system.*;
 

#p#
創(chuàng)建列表
一個(gè) ListField 包含了多列可選項(xiàng)。為了使用戶可以選擇列表中多項(xiàng),聲明列表為MULTI_SELECT.
創(chuàng)建一個(gè)回調(diào)對(duì)象
ListFieldCallback 對(duì)象為列表控制所有重繪任務(wù)。每次要求 Field 顯示列表中的一個(gè)條目。必要的方法也會(huì)在回調(diào)對(duì)象中調(diào)用。
ListFieldCallback 接口的實(shí)現(xiàn)創(chuàng)建了一個(gè)回調(diào)對(duì)象。系統(tǒng)調(diào)用這個(gè)接口的方法繪制列表的行,獲得一個(gè)指定的列表元素,或決定列表的寬度。

允許 Field重繪一行
drawListRow()的實(shí)現(xiàn)允許 Field 重繪一行。傳遞到 drawListRow()的圖形上下文代表整個(gè)列表。相應(yīng)地,drawText()必須指明繪制哪一行。

![]()
允許 Field從列表中得到一個(gè)條目(Entry )
get()的實(shí)現(xiàn)允許 field 從列表中得到一個(gè)條目。本方法返回一個(gè)包含在有明確索引行中的對(duì)象。

為列表返回一個(gè)優(yōu)先的寬度
getPreferredWidth()的實(shí)現(xiàn)為列表返回一個(gè)優(yōu)先的寬度。在下面的實(shí)現(xiàn)中,getPreferredWidth()返回整個(gè)屏幕的繪制寬度。
getPreferredWidth()的實(shí)現(xiàn)返回一個(gè)不同的值,這依賴 field 管理器的類型。例如,如果管理器擴(kuò)展了 HorizontalFieldManager,getPreferredWidth()返回所有 field 寬度的總和。如果擴(kuò)展了 VerticalFieldManager,getPreferredWidth()返回最寬 field 的寬度。

指派回調(diào)以及加入條目到列表中
創(chuàng)建列表對(duì)象,并且將回調(diào)指派這個(gè)對(duì)象。
創(chuàng)建列表對(duì)象
為了列表創(chuàng)建 ListField 對(duì)象以及 ListCallback 對(duì)象。
(注:ListCallback 是一個(gè)定制的 ListFieldCallback 類,這個(gè)類在 66 頁的“創(chuàng)建一個(gè)回調(diào)對(duì)象”中創(chuàng)建。)
![]()
設(shè)置回調(diào)
調(diào)用 setCallback()將 ListFieldCallback 與 ListField 關(guān)聯(lián)。這個(gè)關(guān)聯(lián)允許回調(diào)增加列表項(xiàng)到列表中。
![]()
增加列表?xiàng)l目
為了將條目增加到列表中,創(chuàng)建條目,并指定一個(gè)索引,并在這個(gè)索引上插入每個(gè)條目到ListField 對(duì)象中。然后每個(gè) ListField 對(duì)象到 ListFieldCallback 中。
![]()

代碼實(shí)例
例:SampleListFieldCallback.java
- /**
 - * SampleListFieldCallback.java
 - * Copyright (C) 2001-2005 Research In Motion Limited. All rights
 - reserved.
 - */
 


【編輯推薦】
- BlackBerry應(yīng)用開發(fā)者指南 創(chuàng)建客戶定制的UI組件
 - BlackBerry應(yīng)用開發(fā)者指南 UI API篇之管理UI組件
 - BlackBerry應(yīng)用開發(fā)者指南 UI API篇之顯示UI組件
 - BlackBerry應(yīng)用開發(fā)者指南基礎(chǔ)附錄 .alx文件
 - BlackBerry應(yīng)用開發(fā)者指南 選項(xiàng)API
 















 
 
 





 
 
 
 