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組件
你僅能將定制的上下文菜單項和布局增加到一個定制的 field 中。
創(chuàng)建定制的 field
為覆寫 field 的缺省行為,創(chuàng)建一個定制的 field。
(注:不要使用 Screen 對象來輸入文本。Screen 對象沒有明確的實現(xiàn)此功能,它需要復(fù)雜的輸入方法,例如國際化的鍵盤和 7100 系列的設(shè)備。為了實現(xiàn)不同輸入方法的無縫集成,擴展 Field 或者其任一子類。)
DrawStyle 接口的實現(xiàn)允許在定制的 field 上繪制樣式。
客戶定制的 field 應(yīng)該實現(xiàn)所有相關(guān)的系統(tǒng)樣式。例如,USE_ALL_WIDTH 和 USE_ALL_HEIGHT適用于許多 field。
擴展 Field 類
擴展 Field 類和任一其子類,指定定制 Field 的特征。
定義按鈕的標(biāo)簽,圖形,以及樣式
你的構(gòu)造子的實現(xiàn)定義了按鈕的標(biāo)簽,圖形,以及樣式。
指定 field 中對象的安排
任何擴展 Field 的類必須實現(xiàn) layout().Field 管理器調(diào)用了 layout()方法來決定 field應(yīng)該如何根據(jù)可用的控件安排它的內(nèi)容。
定義需要的寬度
(注:在大多數(shù)情況下,通過覆寫 getPreferredWidth(),確保合適的布局出現(xiàn)在定制的布局管理器里。)
getPreferredWidth()的實現(xiàn)計算出定制 Field 的寬度,這個定制 Field 是基于標(biāo)簽 Field的相對尺寸的。使用相對尺寸來確保標(biāo)簽不會超出標(biāo)簽的尺寸。
定義需要的高度
(注:在大多數(shù)情況下,通過覆寫 getPreferredHeight(),確保合適的布局出現(xiàn)在定制的布局管理器里。)
getPreferredHeight()的實現(xiàn)計算出定制 Field 的高度,這個定制 Field 是基于標(biāo)簽 Field的相對尺寸的。它確保了標(biāo)簽不會超出 field 的尺寸。
定義定制 field 的外觀
paint()的實現(xiàn)定義了 BlackBerry 設(shè)備屏幕上的定制 Field 的外觀,不管什么時候 Field的域標(biāo)記為無效,F(xiàn)ield 管理器都調(diào)用 paint()來重繪 Field。
技巧:驗證 paint()是否是有效率的,因為不管什么時候 field 發(fā)生變化,UI 框架調(diào)用 paint()方法。對于大數(shù)量的 field,使用 Graphics.getClippingRect()并在可見的區(qū)域里繪圖來保存繪制時間。
處理焦點事件
為了支持焦點事件,使用 Field.FOCUSABLE 樣式以及實現(xiàn) Field.moveFocus().如果你想你的 Field 接收焦點,覆寫 Field.isFocusable()返回 true。
當(dāng) Field 獲得焦點時,UI 框架調(diào)用 onFocus(),當(dāng) Field 失去焦點時,調(diào)用 unFocus().如果你的 field 對于這些事件需要特定的行為,覆寫這些方法??蚣苷{(diào)用 moveFocus()來處理 field 的焦點移動事件。它對應(yīng) trackwheelRoll 事件,覆寫 drawFocus( )。
實現(xiàn) set和 get方法
Field 的 get 和 set 方法的實現(xiàn),增加了 Field 的能力。
(注:所有 get 和 set 方法應(yīng)該在 field 加入到一個 Screen 的前后工作。例如,如果現(xiàn)在屏幕上的 field 合適的調(diào)用了 invalidate()或 updateLayout()setLabel(),應(yīng)該使用一個新值來修改其顯示。)
代碼實例
CustomButtonField.java 創(chuàng)建了具有多個圖形的 button field。
#p#
創(chuàng)建定制的上下文菜單項
在 Field 類里,創(chuàng)建定制的上下文菜單項。
提供一個上下文菜單
在主應(yīng)用程序類里,覆寫 makeContextMenu()方法提供一個上下文菜單。
創(chuàng)建應(yīng)用程序菜單
在主應(yīng)用程序類里,覆寫 makeMenu()方法創(chuàng)建應(yīng)用程序菜單,并且無論合十,當(dāng)特定的 field獲取焦點時,更新上下文菜單。
代碼實例
實例: ContextMenuSample.java
- /**
- * ContextMenuSample.java
- * Copyright (C) 2001-2005 Research In Motion Limited. All rights
- reserved.
- */
#p#
創(chuàng)建定制的布局管理器
Manager 對象管理 UI 組件的位置以及決定屏幕上的 field 如何安排。
創(chuàng)建一個定制的布局管理器
擴展 Manager 類或其任一子類
返回一個優(yōu)先的 Field寬度
覆寫 getPreferredWidth(),以致它能為管理器返回一個優(yōu)先的 Field 寬度。
getPreferredWidth()的實現(xiàn)可以返回不同的值,取決于布局管理器的目的。例如,如果管理器擴展了 HorizontalFieldManager,getPreferredWidth()返回所有 field 寬度的總和。如果擴展了 VerticalFieldManager,getPreferredWidth()返回最寬 field 的寬度。
(注:TextField 和 Manger 使用了指派給他們的整個寬度。為組織 2 個或更多的水平上的對象,分別覆寫它們各自的 getPreferredWidth()方法。為了組織多個水平上的TextField,覆寫 layout().)
返回一個優(yōu)先 Field 高度
覆寫 getPreferredHeight(),以致它能為管理器返回一個優(yōu)先的 Field 高度。
指定子 Field如何安排
subLayout()方法指定了管理器如何在屏幕上組織 field。它得到管理器中 field 的個數(shù),然后為子 field 設(shè)置合適的位置以及布局。
layout() 調(diào)用了 subLayout() 方法,subLayout() 方法通過調(diào)用每個管理器包含的 field 的setPositionChild ()以及 LayoutChild(),控制每個子 field 如何加到屏幕上。
(注:為設(shè)置 field 需要的大小,在 subLayout()方法里調(diào)用 setExtend()。如果你不調(diào)用 setExtend(),則不會繪制每個 field,并且也不拋出一個異常。)
處理焦點
當(dāng)用戶滾動滑輪時,為了指定 field 該如何得到焦點,覆寫 nextFocus()方法。direction 參數(shù)描述了焦點移動的方向(一般來說,當(dāng)滑輪向下滾動,焦點向下并且向右方向。當(dāng)滑輪向上滾動,焦點向上并且向左)。
為了將焦點轉(zhuǎn)移到下一個 field,而以管理器的順序,這個 field 不是下一個 field,那么覆寫nextFocus().例如,如果你想為你的管理器實現(xiàn) Page-up 和 Page-down 的功能,那么 nextFocus()就有用了。
當(dāng)可見區(qū)域改變時重繪 field
缺省的,定制的管理器在不考慮剪輯區(qū)域下調(diào)用 paint()重繪所有 field。如果這導(dǎo)致了不必要的重繪,當(dāng)可見區(qū)域改變時,僅 subpaint()的實現(xiàn)重繪所有 field。
代碼實例
例: 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)建列表
一個 ListField 包含了多列可選項。為了使用戶可以選擇列表中多項,聲明列表為MULTI_SELECT.
創(chuàng)建一個回調(diào)對象
ListFieldCallback 對象為列表控制所有重繪任務(wù)。每次要求 Field 顯示列表中的一個條目。必要的方法也會在回調(diào)對象中調(diào)用。
ListFieldCallback 接口的實現(xiàn)創(chuàng)建了一個回調(diào)對象。系統(tǒng)調(diào)用這個接口的方法繪制列表的行,獲得一個指定的列表元素,或決定列表的寬度。
允許 Field重繪一行
drawListRow()的實現(xiàn)允許 Field 重繪一行。傳遞到 drawListRow()的圖形上下文代表整個列表。相應(yīng)地,drawText()必須指明繪制哪一行。
允許 Field從列表中得到一個條目(Entry )
get()的實現(xiàn)允許 field 從列表中得到一個條目。本方法返回一個包含在有明確索引行中的對象。
為列表返回一個優(yōu)先的寬度
getPreferredWidth()的實現(xiàn)為列表返回一個優(yōu)先的寬度。在下面的實現(xiàn)中,getPreferredWidth()返回整個屏幕的繪制寬度。
getPreferredWidth()的實現(xiàn)返回一個不同的值,這依賴 field 管理器的類型。例如,如果管理器擴展了 HorizontalFieldManager,getPreferredWidth()返回所有 field 寬度的總和。如果擴展了 VerticalFieldManager,getPreferredWidth()返回最寬 field 的寬度。
指派回調(diào)以及加入條目到列表中
創(chuàng)建列表對象,并且將回調(diào)指派這個對象。
創(chuàng)建列表對象
為了列表創(chuàng)建 ListField 對象以及 ListCallback 對象。
(注:ListCallback 是一個定制的 ListFieldCallback 類,這個類在 66 頁的“創(chuàng)建一個回調(diào)對象”中創(chuàng)建。)
設(shè)置回調(diào)
調(diào)用 setCallback()將 ListFieldCallback 與 ListField 關(guān)聯(lián)。這個關(guān)聯(lián)允許回調(diào)增加列表項到列表中。
增加列表條目
為了將條目增加到列表中,創(chuàng)建條目,并指定一個索引,并在這個索引上插入每個條目到ListField 對象中。然后每個 ListField 對象到 ListFieldCallback 中。
代碼實例
例: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ā)者指南 選項API