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